Ich bevorzuge definitiv die EDIT # 3- Lösung (siehe unten).
Wenn es sich nicht in derselben Shell befindet, verwenden Sie eine while- Schleife mit der Bedingung ps -p, die true zurückgibt . Setzen Sie einen Schlaf in die Schleife, um die Prozessorauslastung zu reduzieren.
while ps -p <pid> >/dev/null 2>&1
do
sleep 10
done
oder wenn Ihr UNIX / proc unterstützt (z. B. HP-UX immer noch nicht).
while [[ -d /proc/<pid> ]]
do
sleep 10
done
Wenn Sie eine Auszeit wünschen
timeout=6 # timeout after 1mn
while ((timeout > 0)) && ps -p <pid> >/dev/null 2>&1
do
sleep 10
((timeout -= 1))
done
EDIT # 1
Es gibt einen anderen Weg: Verwenden Sie kein Cron . Verwenden Sie den Batch - Befehl , um Ihre Aufträge zu stapeln.
Zum Beispiel könnten Sie täglich alle Ihre Jobs stapeln. Der Stapel kann so optimiert werden, dass eine gewisse Parallelität besteht, sodass ein blockierter Job nicht den gesamten Stapel stoppt (dies hängt vom Betriebssystem ab).
EDIT # 2
Erstellen Sie ein FIFA in Ihrem Home-Verzeichnis:
$ mkfifo ~/tata
am Ende deines Jobs:
echo "it's done" > ~/tata
zu Beginn des anderen Jobs (derjenige, der wartet):
cat ~/tata
Es ist keine Abfrage, es ist alt, gut, IO zu blockieren.
EDIT # 3
Signale verwenden:
Zu Beginn des Skripts:
echo $$ >>~/WeAreStopped
kill -STOP $$
am ende deiner langen arbeit:
if [[ -f ~/WeAreStopped ]] ; then
xargs kill -CONT < ~/WeAreStopped
rm ~/WeAreStopped
fi