Definitivamente, prefiro a solução EDIT # 3 (veja abaixo).
se não estiver no mesmo shell, use um laço while com a condição em ps -p retornando true. Coloque um sleep no loop para reduzir o uso do processador.
while ps -p <pid> >/dev/null 2>&1
do
sleep 10
done
ou se o seu UNIX estiver suportando / proc (por exemplo, o HP-UX ainda não suporta).
while [[ -d /proc/<pid> ]]
do
sleep 10
done
Se você quiser um tempo limite
timeout=6 # timeout after 1mn
while ((timeout > 0)) && ps -p <pid> >/dev/null 2>&1
do
sleep 10
((timeout -= 1))
done
EDIT # 1
Existe uma outra maneira: não use cron . Use o comando lote para empilhar seus trabalhos.
Por exemplo, você pode acumular diariamente todos os seus trabalhos. O lote pode ser ajustado para permitir algum paralelismo, portanto, um trabalho bloqueado não interromperá toda a pilha (depende do sistema operacional).
EDIT # 2
Crie um fifo no seu diretório pessoal:
$ mkfifo ~/tata
no final do seu trabalho:
echo "it's done" > ~/tata
no início do outro trabalho (aquele que está esperando):
cat ~/tata
Não é polling que é um bom bloqueio IO.
EDIT # 3
Usando sinais:
No início do (s) script (s) que estão aguardando:
echo $$ >>~/WeAreStopped
kill -STOP $$
no final do seu longo trabalho:
if [[ -f ~/WeAreStopped ]] ; then
xargs kill -CONT < ~/WeAreStopped
rm ~/WeAreStopped
fi