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?
pgrep -f app.py
? Você pode usargrep -v "grep"
para eliminar grep (ou pgrep) da saída.grep -v "grep"
foi a solução. Não estou 100% familiarizado com os detalhes de implementação do cron, mas parecepgrep -f
que 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 #Respostas:
Para quem se deparar com isso no futuro, a solução era bastante simples:
Ao executar
em um cronjob, ele retornará um processo para o shell bash gerado pelo cron.
Em vez disso, tive que usar
para procurar o processo em execução e remover simultaneamente qualquer processo que tenha "grep" no nome
fonte