Preferisco decisamente la soluzione EDIT # 3 (vedi sotto).
se non è nella stessa shell usa un ciclo while con condizione su ps -p che ritorna vero. Metti uno sleep in loop per ridurre l'utilizzo del processore.
while ps -p <pid> >/dev/null 2>&1
do
sleep 10
done
o se UNIX supporta / proc (ad esempio HP-UX non lo supporta ancora).
while [[ -d /proc/<pid> ]]
do
sleep 10
done
Se vuoi un timeout
timeout=6 # timeout after 1mn
while ((timeout > 0)) && ps -p <pid> >/dev/null 2>&1
do
sleep 10
((timeout -= 1))
done
EDIT # 1
C'è un altro modo: non usare cron . Utilizzare il comando batch per impilare i lavori.
Ad esempio, è possibile impilare quotidianamente tutti i lavori. Il batch può essere ottimizzato per consentire un po 'di parallelismo in modo che un lavoro bloccato non arresti l'intero stack (dipende dal sistema operativo).
EDIT # 2
Crea un fifo nella tua home directory:
$ mkfifo ~/tata
alla fine del tuo lavoro:
echo "it's done" > ~/tata
all'inizio dell'altro lavoro (quello che sta aspettando):
cat ~/tata
Non è polling, è un buon vecchio blocco IO.
EDIT # 3
Utilizzando i segnali:
All'inizio degli script che stanno aspettando:
echo $$ >>~/WeAreStopped
kill -STOP $$
alla fine del tuo lungo lavoro:
if [[ -f ~/WeAreStopped ]] ; then
xargs kill -CONT < ~/WeAreStopped
rm ~/WeAreStopped
fi