What's the best way of setting up a cron job to check that a long-running process is still going and if not, start it?
Uma abordagem simples é ter um script simples que verifique se o processo está sendo executado ou não e reinicie-o quando necessário.
(Às vezes é melhor validar se o processo está sendo executado por meio de uma 'transação fictícia', por exemplo, para verificar um processo SMTP, você pode estabelecer uma conexão de porta TCP e verificar se ela responde corretamente.)
Mas observe as diferenças em seu ambiente entre você como usuário interativo e quando o cron (8) executa seu script.
Para responder à segunda parte da sua pergunta:
If I start a long-running process in cron, is it going to block? or does cron fork the process as an independent child?
o cron (8) irá bifurcar para executar um cron job, mas a menos que seu script ou processo 'desconecte', o cron irá mantê-lo como um processo filho até que ele saia (é assim que o cron é capaz de coletar todas as saídas do stderr e envie-o via e-mail.
Mas, eu acho que você estava pensando, você poderia realmente executar o processo de longa duração do cron? Se você fizer isso, você precisa ter certeza de que ele só pode iniciar uma cópia de si mesmo, e que ele sairá rapidamente se já estiver sendo executado.
Melhores soluções para manter processos de longa execução em execução - se você estiver preocupado apenas com uma saída ou falha
- Se o seu processo puder ser mantido conectado, use init (1) via inittab (5) e a opção 'respawn'. Frequentemente, até daemons têm opções "sem garfo".
- Ou, se o seu sistema operacional não tiver um recurso inittab ou você não tiver acesso a ele, use algo como daemontools do DJB .
- se você pudesse usar o Solaris 10 ou o OpenSolaris, poderá usar o SMF. (Isso pode até mesmo funcionar com processos que fazem o fork e desanexar.)
- Se for seu próprio código, você pode escrevê-lo para ter um par pai / filho de processos, em que o pai reinicia o filho sempre que receber um SIGCHLD.