Zdecydowanie wolę rozwiązanie EDIT # 3 (patrz poniżej).
jeśli nie jest w tej samej powłoki użyć while pętlę Warunkiem PS -p powrocie prawdziwe. Położyć spać w pętlę, aby zmniejszyć zużycie procesora.
while ps -p <pid> >/dev/null 2>&1
do
sleep 10
done
lub jeśli twój system UNIX obsługuje / proc (na przykład HP-UX nadal nie obsługuje).
while [[ -d /proc/<pid> ]]
do
sleep 10
done
Jeśli chcesz przekroczyć limit czasu
timeout=6 # timeout after 1mn
while ((timeout > 0)) && ps -p <pid> >/dev/null 2>&1
do
sleep 10
((timeout -= 1))
done
EDYCJA 1
Jest inny sposób: nie używaj crona . Użyj polecenia wsadowego do układania zadań w stos.
Na przykład możesz codziennie układać wszystkie swoje prace. Partię można dostroić, aby umożliwić pewną równoległość, dzięki czemu zablokowane zadanie nie zatrzyma całego stosu (zależy to od systemu operacyjnego).
EDYCJA 2
Utwórz fifo w swoim katalogu domowym:
$ mkfifo ~/tata
pod koniec pracy:
echo "it's done" > ~/tata
na początku innej pracy (tej, która czeka):
cat ~/tata
To nie odpytywanie, to stare dobre blokowanie IO.
EDYCJA # 3
Za pomocą sygnałów:
Na początku skryptu (ów), który (e) czeka:
echo $$ >>~/WeAreStopped
kill -STOP $$
pod koniec długiej pracy:
if [[ -f ~/WeAreStopped ]] ; then
xargs kill -CONT < ~/WeAreStopped
rm ~/WeAreStopped
fi