Eu tenho um programa que faz uma grande quantidade de trabalho (leva cerca de 4-5 horas) que é iniciado pelo cron quando todos os dados com os quais trabalha ficam disponíveis. Às vezes, quando estou aguardando o término, gostaria de poder iniciar outro programa (interativo) quando terminar. a chamada em espera parece promissora, mas só aguarda crianças.
shell-script
process
hildred
fonte
fonte
ipc
também a comunicação entre processos.man ipc
.Respostas:
Definitivamente, prefiro a solução EDIT # 3 (veja abaixo).
se não no mesmo shell usar um enquanto loop com condição em ps -p retornando true. Coloque um sono no circuito para reduzir o uso do processador.
ou se o seu UNIX estiver suportando / proc (por exemplo, o HP-UX ainda não possui).
Se você quer um tempo limite
EDIT # 1
Existe uma outra maneira: não use cron . Use o comando batch para empilhar seus trabalhos.
Por exemplo, você pode diariamente empilhar todos os seus trabalhos. O lote pode ser ajustado para permitir algum paralelismo, para que um trabalho bloqueado não pare toda a pilha (depende do sistema operacional).
EDIT # 2
Crie um fifo no seu diretório pessoal:
no final do seu trabalho:
no início do outro trabalho (aquele que está esperando):
Não está pesquisando, é bom IO de bloqueio antigo.
EDIT # 3
Usando sinais:
No início do script, quem está esperando:
no final do seu longo trabalho:
fonte
Você pode modificar seu trabalho cron para usar algum sinalizador.
Ao invés de
Você pode usar
E apenas monitore esse arquivo em script ou mesmo manualmente. Se existir, seu programa está sendo executado; caso contrário, sinta-se livre para fazer o que quiser.
A amostra do script:
Caso você não goste de usar
sleep
, você pode modificar o script e executá-lo via cron uma vez a cada X minutos.Nesse caso, a amostra de script será:
Dessa forma, é um pouco mais fácil, pois você não precisa encontrar o PID do seu processo cron.
fonte
Não há facilidade para um processo aguardar a conclusão de outro processo, exceto um pai para aguardar a conclusão de um de seus processos filhos. Se você puder, inicie o programa através de um script:
Se você não puder fazer isso, por exemplo, antes de começar a grande quantidade de trabalho a partir de um trabalho cron, mas o programa interativo a partir do contexto da sua sessão, faça isso
Existem várias maneiras de implementar
notify_completion
. Alguns ambientes de área de trabalho fornecem um mecanismo de notificação ( abrir uma janela em um monitor X remoto (por que "Não é possível abrir o monitor")? Pode ser útil). Você também pode criar um usando as notificações de alteração de arquivo. No Linux, o recurso de notificação de alteração de arquivo é inotify .Para reagir à criação de
/path/to/finished.stamp
:Se você não pode alterar a maneira como
do_large_amount_of_work
é chamado, mas sabe qual arquivo ele modifica por último, pode usar o mesmo mecanismo para reagir quando esse arquivo é fechado. Você também pode reagir a outros eventos, como a renomeação de um arquivo (consulte oinotifywait
manual para obter uma lista de possibilidades).fonte
O script sendo acionado pelo cronjob invoca um script de shell vazio no qual você pode inserir tarefas de acompanhamento, se necessário.
É muito semelhante à abordagem de Gilles.
cronjob-task.sh
contém:onde
post-execute.sh
geralmente está vazio, a menos que você veja que precisa disparar uma tarefa de acompanhamento.fonte