o daemon do cron forjando vários processos e executando jobs várias vezes

3

Estou executando um monte de tarefas cron (configuradas usando sudo crontab -e ) no Ubuntu e, recentemente (embora não saiba quando ter certeza), de repente, vejo as mesmas tarefas que parecem ser executadas várias vezes vezes no mesmo minuto. Você não precisa ver o crontab completo para confiar em mim que eles absolutamente não são listados duas vezes. Mas para um sabor, aqui está um trecho:

*/2 * * * * /usr/bin/wget --no-check-certificate 'https://myserver.net/someuri/pdm/33?embed_in_page=xyz'
* * * * * /usr/bin/wget --no-check-certificate 'https://myserver.net/someuri/pdm/77'
* * * * * /usr/bin/wget --no-check-certificate 'https://myserver.net/someuri/pdm/20?blah=blah'
* * * * * echo "'date' Running now" >> /home/somewhere/croncheck

Eu também adicionei esse eco simples ao final para rodar a cada minuto, e isso nunca parece rodar mais de uma vez.

Então, para o eco eu só vejo isso acontecer uma vez por minuto. Mas intermitentemente, especialmente sob carga, o servidor parece disparar as solicitações de URL do wget várias vezes em sucessão (eu sei, olhando para o log do servidor web, que elas estão vindo do mesmo lugar aproximadamente ao mesmo tempo).

Se eu executar ps -A |grep cron

Verei uma dúzia ou mais de entradas semelhantes:

28055 ?        00:00:00 cron

Eles não parecem desaparecer.

Se eu executar ps aux , só vejo a entrada como esperava.

Então, meu palpite é que há uma interação desagradável entre o wget e o cron, e talvez algo esteja falhando de alguma forma (mesmo que o servidor, e as chamadas interativas para o mesmo servidor da Web por meio de um navegador da web pareçam pouco afetadas, pelo trabalho desnecessário). Mas a realidade é que eu não sei. Estou procurando por quaisquer ideias que você possa ter sobre a causa e possíveis soluções para o problema.

    
por phil_ayres 18.04.2013 / 00:45

2 respostas

1

Embora eu não saiba exatamente por que isso está acontecendo, parece que trabalhos de longa duração dentro do cron causam um comportamento estranho. Na postagem original, há uma série de trabalhos que são disparados a cada cinco minutos e outros um minuto após o outro. Se o primeiro trabalho demorar muito (10 minutos, por exemplo), meu palpite é que o processo bifurcado do primeiro trabalho fica pendurado por dez minutos e aciona os trabalhos subseqüentes na lista. Mas o processo principal do cron também está disparando esses trabalhos corretamente, de modo que as duplicatas ocorrem e todo o problema ocorre em cascata.

Chega de adivinhação. Para corrigir, aqui está um trecho do meu novo crontab, usando flock para bloquear trabalhos subseqüentes que poderiam ser executados em cascata incorretamente.

# every 5 minutes
*/5 * * * * flock -w 2000 /tmp/cnsd.lockfile.pdm -c "/usr/bin/longrunningjob1"
# every 5 minutes
*/5 * * * * flock -w 2000 /tmp/cnsd.lockfile.pdm -c "/usr/bin/longrunningjob2"
# every 15 minutes past the hour
15 * * * * flock -w 2000 /tmp/cnsd.lockfile.pdm -c "/usr/bin/longrunningjob3"

Pelo menos dessa forma, quando o sistema está sobrecarregado, ele não causa uma série de tarefas que nunca deveriam ter sido disparadas, dando a chance a tudo se recuperar. Eu joguei com diferentes classes de tarefas usando arquivos de bloqueio diferentes, mas no meu caso eu só tinha recursos limitados, então enfileirar um atrás do outro era a melhor maneira de manter o sistema rodando.

    
por 15.12.2014 / 17:25
0

Verifique se os registros da web estão exibindo a mesma entrada várias vezes. Se sim, verifique se eles estão exatamente no mesmo momento. Cron não é absoluto e como foi dito, por vezes, o sistema é tributado. O Cron irá "tentar" executar os trabalhos no horário indicado, mas não é absoluto e, às vezes, um trabalho será executado depois do esperado e pode ser no momento do mesmo trabalho e, em seguida, você verá duas entradas.

Outro problema talvez seja que um trabalho demora mais do que o esperado e ainda está em execução quando a próxima iteração dele começar. Eu começaria com a eliminação. Comente todos menos um e deixe-o correr e monitorar, em seguida, adicione o próximo e o próximo etc para ver o que acontece.

    
por 18.04.2013 / 03:25

Tags