Comando Cron não funciona, mas funciona com shell

0

Eu tenho um cronjob extremamente simples que eu configurei para garantir que um script continue em execução e me envie um e-mail se ficar inativo (baixa tecnologia, eu sei, mas foi planejado como uma solução rápida)

Infelizmente, este cronjob não está fazendo seu trabalho

Aqui está a linha relevante do meu crontab:

* * * * * pgrep -f app.py || echo "Your app is down" | mail -s "URGENT" steven.abarnett@gmail.com

Quando executo o comando no shell, ele funciona: recebo um email apenas se o aplicativo estiver inativo. Como efeito colateral menor, quando o aplicativo está sendo executado, ele envia o PID para a tela.

Quando executo o comando através de um cronjob, nunca recebo nenhum email. Investigando (configurando o MAILTO=parâmetro para ver a saída do cronjob) notei que, quando o aplicativo está sendo executado, ele gera dois PIDs e, quando o aplicativo não está sendo executado, gera um PID (nunca zero, portanto nunca envia um email)

É quase como se o cronjob estivesse gerando um processo que, por sua vez, é visto por si só - como a digitação ps -ax | grep "anything"sempre retornará:

12345 pts/2    S+     0:00 grep --color=auto anything

Alguém sabe como consertar esse cronjob?

stevendesu
fonte
11
Eu suspeito que seu palpite está correto - o cron provavelmente está nomeando o processo - você tentou usar o MAILTO para ver a saída de pgrep -f app.py? Você pode usar grep -v "grep"para eliminar grep (ou pgrep) da saída.
Brydon Gibson
O AFAIK crontab apenas inicia os programas, não é um shell. Você já tentou colocar seu grande comando em um script e tornar esse script o destino da entrada cron?
Xenóide
grep -v "grep"foi a solução. Não estou 100% familiarizado com os detalhes de implementação do cron, mas parece pgrep -fque não funciona. Eu acho que ele executa o processo "bash" (ou similar) com argumentos para o comando que você deseja executar? Independentemente disso, funcionou #
stevendesu

Respostas:

1

Para quem se deparar com isso no futuro, a solução era bastante simples:

Ao executar

pgrep -f "anything"

em um cronjob, ele retornará um processo para o shell bash gerado pelo cron.

Em vez disso, tive que usar

ps -ax | grep "anything" | grep -v grep

para procurar o processo em execução e remover simultaneamente qualquer processo que tenha "grep" no nome

stevendesu
fonte