Tarefa Cron para verificar se o script PHP está sendo executado, se não, em seguida, execute

4

Eu estou querendo saber se alguém pode me apontar na direção certa. Eu tenho pouca experiência em trabalhar com a linha de comando do Linux e, recentemente, devido a vários fatores no trabalho que me foram solicitados para adquirir conhecimento.

Basicamente eu tenho dois scripts php que residem em um diretório no meu servidor. Para os propósitos do aplicativo, esses scripts devem estar em execução continuamente. Atualmente eu implemento isso dessa maneira:

nohup sh -c 'while true; do php get_tweets.php; done' >/dev/null &

e

nohup sh -c 'while true; do php parse_tweets.php; done' >/dev/null &

No entanto, notei que, apesar do loop infinito, os scripts param periodicamente e sou forçado a reiniciá-los. Não tenho certeza porque, mas eles fazem. Isso me fez olhar para a perspectiva de um trabalho CRON que verifica se eles estão em execução e, se não estiverem, execute-os / reinicie-os.

Alguém poderia me fornecer algumas informações sobre como fazer isso?

    
por Javacadabra 30.09.2014 / 17:11

3 respostas

7

Gostaria de expandir a resposta de Davidann, já que você é novo no conceito de cron job. Todo sistema UNIX ou Linux possui um crontab armazenado em algum lugar. O crontab é um arquivo de texto simples. Considere o seguinte: (Do Wiki do Gentoo no Cron )

#Mins  Hours  Days   Months  Day of the week
10     3      1      1       *       /bin/echo "I don't really like cron"
30     16     *      1,2     *       /bin/echo "I like cron a little"
*      *      *      1-12/2  *       /bin/echo "I really like cron"

This crontab should echo "I really like cron" every minute of every hour of every day every other month. Obviously you would only do that if you really liked cron. The crontab will also echo "I like cron a little" at 16:30 every day in January and February. It will also echo "I don't really like cron" at 3:10 on the January 1st.

Sendo novo no cron, você provavelmente desejará comentar as colunas com estrela para que você saiba para que cada coluna é usada. Toda implementação Cron que conheço sempre foi essa ordem. Agora mesclando a resposta de Davidann com meu arquivo comentado:

#Mins  Hours  Days   Months  Day of week
  *     *      *      *       *   lockfile -r 0 /tmp/the.lock && php parse_tweets.php; rm -f /tmp/the.lock

* * * * * lockfile -r 0 /tmp/the.lock & & php get_tweets.php; rm -f /tmp/the.lock

Não colocando nenhum valor em cada coluna, o padrão é:
Cada minuto de cada hora de cada dia de cada mês durante toda a semana, - > Cada minuto todo o ano.

Como Davidann afirma que usar um arquivo de travamento garante que apenas uma cópia do interpretador php seja executada, php parse_tweets.php é o comando para "executar" o arquivo, e o último bit da linha excluirá o arquivo de bloqueio para ficar pronto para o arquivo próxima corrida. Eu não gosto de apagar um arquivo a cada minuto, mas se este é o comportamento que você precisa, isso é muito aceitável. Escrever e reescrever para disco é apenas uma preferência pessoal

    
por 30.09.2014 / 17:53
4

Em vez de ter um cron separado apenas para iniciá-lo, se ele não estiver sendo executado, por que não usar exclusivamente o cron?

Por exemplo:

* * * * * 'lockfile -r 0 /tmp/the.lock && (php parse_tweets.php; rm -f /tmp/the.lock)'

Isso executará a tarefa cron que executará parse_tweets.php uma vez por minuto usando um arquivo de travamento para que você tenha apenas uma cópia executada pelo cron em execução por vez. (Isso não impedirá que você execute php parse_tweets.php fora do cron)

    
por 30.09.2014 / 17:25
0

A verificação em intervalos regulares não é conveniente nem confiável. Se seus scripts pararem, eles não serão reiniciados até que a tarefa do cron seja executada novamente.

Existem ferramentas para garantir que um processo esteja sempre em execução , como supervise de daemontools , monit , deus , supervisord , Inicie a ferramenta de monitoramento no momento da inicialização e deixe-a em paz.

while true; do … done é uma ferramenta de monitoramento bruta, mas eficaz, mas você precisa tomar algumas precauções. nohup é um começo. Certifique-se de redirecionar a entrada padrão para que não seja o terminal (algumas implementações de nohup fazem isso para você). Você deve registrar a saída em um arquivo e verificar esse arquivo em caso de erros.

nohup sh -c 'while true; do …; done' </dev/null >myscript.log 2>&1 &

Verifique também se o seu shell não enviará um sinal para esse trabalho quando ele sair. Se seu shell tiver um disown incorporado, execute-o.

Em muitos sistemas, você pode fazer com que o supervisor inicie no momento da inicialização registrando uma entrada @reboot . Verifique a página crontab(5) man em seu sistema para ver se @reboot é suportado.

@reboot while true; do …; done </dev/null >myscript.log 2>&1
    
por 01.10.2014 / 01:07