Cronjob bashscript help

1

Eu examinei um monte de guias de solução de problemas do cronjob, mas parece que não consigo encontrar o que estou fazendo de errado. Este script funciona muito bem se eu o executar manualmente. Executá-lo a partir do crontab simplesmente não está funcionando. Veja como o script se parece:

#!/bin/bash

#d1 establishes the date range as 10 minutes prior to running the script to the time the script is run.
d1=$(date --date="-10 min" "+%b %_d %H:%M")

#d2 formats the date for the script.
d2=$(date "+%b %_d %H:%M")

#d3 displays the standard current date format.
d3=$(date)

#sent_emails variable shows the number of emails sent in the last 10 minutes. It accomplishes this by searching for the keyword "sent" in mail.log, then filtering that list down to any sen$
sent_emails=$(find /var/log/mail.log | xargs grep "sent" |  awk -v d1="$d1" -v d2="$d2" '$0 > d1 && $0 < d2 || $0 ~ d2' | wc -l)

#If 50 emails are sent in the last 10 minutes, then postfix is stopped and the date + the number of emails sent in the last 10 minutes are printed. If less than 50 are sent in the last 10 $
if [ $sent_emails -lt 1 ]; then
    echo "$d3 - $sent_emails emails sent in last 10 minutes"
else
    postfix stop
    echo "$d3 - $sent_emails in the last 10 minutes; postfix terminated"
fi

O script é definido como executável (chmod u + x) e é de propriedade de root: root. Ele funciona toda vez que eu o executo manualmente. Eu tenho o conjunto condicional para "1" agora para teste. Não quero que um email acione um desligamento de postfix no futuro.

Veja como meu crontab se parece:

*/1 * * * * /bin/bash /home/rommy/spam_monitor.sh &> /home/rommy/cronresults.txt

Existe uma linha extra após o comando acima no crontab. Nada aparece no cronresults.txt. Eu tenho isso correndo a cada minuto agora para testes. Não será executado com frequência na produção.

Qualquer ajuda seria muito apreciada !!

    
por Joseph Odell 20.08.2015 / 20:34

2 respostas

2

Você está usando &> para redirecionar STDOUT e STDERR, que é bash ism. Como o shell padrão para cron (não é a mesma coisa que seus scripts shebang) é sh (que é dash no Ubuntu), ele não entende a sintaxe &> . Como resultado, está tratando o & para colocar o script de shell como um job em background.

Para superar isso, use o modo de redirecionamento portátil:

*/1 * * * * /home/rommy/spam_monitor.sh >/home/rommy/cronresults.txt 2>&1
    
por heemayl 20.08.2015 / 20:49
0

Isto é mais uma crítica de estilo. Uma prática recomendada é citar cadeias de caracteres que o shell NÃO deve expandir com '' e strings que o shell deve expandir com "". Assim, ao invés de:

d1=$(date --date="-10 min" "+%b %_d %H:%M")

Use

d1="$(date --date='-10 min' '+%b %_d %H:%M')"

Além disso, o seu

find /var/log/mail.log | xargs grep "sent" |

é mais facilmente feito por

grep 'sent' /var/log/mail.log |

Você também pode adicionar, após esta linha:

d3="$(date)"

echo "At $(date) d1=/$d1/,d2=/$d2/, d3=/$d3/" >>/tmp/spammonitor.log
    
por waltinator 20.08.2015 / 23:40