crontab, instância, problemas de memória + spam

crontab, instância, problemas de memória + spam

Eu tenho um cronjob que executa php5 wp-cron.php a cada minuto para atualizar meu site.

No entanto, algo aconteceu e eu tive mais de 30 instâncias (31 está marcado neste despejo de ps aux). Ele consumiu minha memória RAM, fez com que uma instância adicional fosse encerrada por falta de memória e fez com que eu não conseguisse fazer o ssh na caixa.

Não consigo entender por que as instâncias duraram mais de 30 minutos, geralmente leva alguns segundos. No dia em que aconteceu, eu não tinha nenhum trabalho planejado (embora talvez o wp cache o tenha usado? Mas nunca tive problemas antes)

O que posso fazer para evitar que um cronjob envie spam e destrua minha memória? Existe uma maneira de dizer para não iniciar se uma instância estiver ativa? e se uma instância estiver ativa por mais de 5 minutos, matá-la?

Existe uma maneira de me proteger de algo semelhante acontecer?

Responder1

Acho que a primeira coisa que você precisa fazer é intrigar o culpado que pode ter causado 31 ocorrências desse trabalho. Normalmente, pode ser que o seu programa esteja travado em algum momento. Você deve depurar e corrigir esse problema, a menos que não queira que seu site seja atualizado com êxito.

Para "Existe uma maneira de dizer para não iniciar se uma instância estiver ativa", sim, existem algumas maneiras, uma delas é apenas verificar pgrep yourprogramnamese uma instância já existe, se sim, você pode ligar pkill -x yourprogramnamepara matá-los todos.

Responder2

Para evitar a execução de múltiplas cópias, use rebanho (Linux), lockf (FreeBSD), shlock (fornecido com alguns sistemas, menos confiáveis). Isso não limitará o tempo de execução, mas garantirá que apenas um processo esteja em execução. Então, se ele travar, você poderá analisar seu estado rapidamente.

Você pode limitar o tempo de CPU do processo gerado usando o shell ulimit integrado.

Para limitar o tempo de espera, você pode escrever um script que aguarda o encerramento do processo e o encerra após o tempo limite. É mais fácil em Python/Perl/etc. mas o shell também permite isso (usando trap e/em filhos de segundo plano).

Às vezes é útil fornecer um tempo fixo entre as invocações (ou seja, do final da anterior até o início da próxima) em vez de iniciar a invocação, como faz o cron. Os tipos usuais de cron não permitem isso, você deve executar um script especial.

informação relacionada