Qual é a melhor maneira de configurar um cron job para verificar se um processo de longa duração ainda está sendo executado e, caso contrário, iniciá-lo?

5

De acordo com o título:

Qual é a melhor maneira de configurar um cron job para verificar se um processo de longa duração ainda está sendo executado e, caso contrário, iniciá-lo?

Se eu iniciar um processo de longa duração no cron, ele irá bloquear? ou o cron bifurca o processo como um filho independente?

Obrigado!

    
por Ben 20.08.2009 / 10:55

5 respostas

5

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.
por 20.08.2009 / 12:44
4

Um idioma comum é para um processo de longa execução ter um arquivo pid. Basicamente, um arquivo em /var/run ou similar que apenas tem o pid, ou id do processo do programa. Quando o programa inicia ele coloca o arquivo lá, quando ele pára, ele remove o arquivo. Você pode verificar facilmente se o programa está lá, vendo se esse arquivo está lá.

Isso também pode ser usado para ver se o programa travou. Se o arquivo estiver lá, mas não houver nenhum processo sendo executado com esse pid, o programa parou, mas não removeu o arquivo pid, ou seja, ele falhou. Nesse caso, você pode remover o arquivo pid e reiniciar o programa. No entanto, isso não é à prova de idiotas, pois às vezes o PID pode ser reutilizado por um novo processo que começou depois que o original caiu.

    
por 20.08.2009 / 12:02
1

Dependendo de como você detecta seu processo, o cronjob pode parecer

* * * * * pidof executable || /usr/local/bin/executable

desde que o seu executável se apresente como se estivesse na lista de processos. A maneira mais sensata seria ter um pidfile e usar start-stop-daemon. Na verdade, tudo depende do processo em questão. Um tempo atrás eu também escrevi um pequeno daemon de manutenção de processos dudki exatamente para esse propósito.

E não, o cron não bloqueará, mas, dependendo da natureza do seu processo, talvez você queira fazer um plano de fundo, de qualquer forma.

    
por 20.08.2009 / 15:01
1

Por "longa duração" você quer dizer algo que demora muito tempo para ser executado, ou um daemon que deveria estar rodando continuamente?

Se você quer dizer um processo que demora muito para ser concluído, então, como sugerido, o processo deve criar um arquivo pid e procurar por esse arquivo na inicialização. Se o arquivo existir, envie uma mensagem e saia de forma limpa. Caso contrário, inicie normalmente.

Se você quer dizer um daemon (às vezes chamado de serviço), ao invés de usar o cron, você deve dar uma olhada em ps-watcher , eu uso para fazer a mesma coisa.

No site: "... ele pode ser usado para garantir que um daemon esteja em execução ou não esteja sendo executado muitas vezes. Ele também pode ser usado para determinar quando um processo consumiu muitos recursos, talvez devido a vazamento de memória. "

Você acabou de configurar o ps-watcher para procurar pelo seu processo. O ps-watcher irá verificar a lista de processos e, se não for encontrado, o ps-watcher irá iniciá-lo para você.

    
por 20.08.2009 / 15:29
0
O

monit foi desenvolvido para resolver esse problema.

    
por 05.02.2010 / 15:55