Definitivamente prefiero la solución EDIT # 3 (ver más abajo).
Si no está en el mismo shell utilizan un mientras bucle con la condición en ps -p regresar cierto. Poner un sueño en el bucle para reducir el uso del procesador.
while ps -p <pid> >/dev/null 2>&1
do
sleep 10
done
o si su UNIX es compatible con / proc (por ejemplo, HP-UX todavía no lo hace).
while [[ -d /proc/<pid> ]]
do
sleep 10
done
Si quieres un tiempo de espera
timeout=6 # timeout after 1mn
while ((timeout > 0)) && ps -p <pid> >/dev/null 2>&1
do
sleep 10
((timeout -= 1))
done
EDITAR # 1
Hay otra forma: no use cron . Use el comando por lotes para apilar sus trabajos.
Por ejemplo, podría apilar diariamente todos sus trabajos. El lote puede ajustarse para permitir cierto paralelismo para que un trabajo bloqueado no detenga toda la pila (depende del sistema operativo).
EDITAR # 2
Cree un fifo en su directorio de inicio:
$ mkfifo ~/tata
al final de tu trabajo:
echo "it's done" > ~/tata
Al comienzo del otro trabajo (el que está esperando):
cat ~/tata
No está sondeando, es viejo bueno bloqueando IO.
EDITAR # 3
Usando señales:
Al comienzo de la secuencia de comandos que está esperando:
echo $$ >>~/WeAreStopped
kill -STOP $$
al final de tu largo trabajo:
if [[ -f ~/WeAreStopped ]] ; then
xargs kill -CONT < ~/WeAreStopped
rm ~/WeAreStopped
fi