Question Aide de Cronjob bashscript


J'ai regardé à travers un tas de guides de dépannage de cronjob, mais je n'arrive pas à trouver ce que je fais mal. Ce script fonctionne correctement si je l'exécute manuellement. Le lancer à partir de crontab ne fonctionne tout simplement pas. Voici à quoi ressemble le script:

#!/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

Le script est configuré pour être exécutable (chmod u + x) et appartient à root: root. Cela fonctionne à chaque fois que je l'exécute manuellement. J'ai le jeu conditionnel à "1" maintenant pour le test. Je ne veux pas qu'un email déclenche un arrêt postfixe dans le futur.

Voici à quoi ressemble mon crontab:

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

Il y a une ligne supplémentaire après la commande ci-dessus dans la crontab. Rien ne s'affiche jamais dans cronresults.txt. Je le fais courir chaque minute maintenant pour le test. Il ne fonctionnera pas si souvent en production.

Toute aide serait grandement appréciée !!


1
2017-08-20 18:34


origine




Réponses:


Vous utilisez &> pour rediriger à la fois STDOUT et STDERR, qui est un bashism. Comme shell par défaut pour cron (pas la même chose que vos scripts shebang) est sh (lequel est dash dans Ubuntu), il ne comprend pas &> syntaxe. En conséquence, il traite le & mettre le script shell en tâche de fond.

Pour surmonter cela, utilisez le moyen de redirection portable:

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

2
2017-08-20 18:49



Cela me permet de dépanner la sortie du script! Je vous remercie! Que font les 2> & 1 pour le script? - Joseph Odell
@JosephOdell 2>&1 enverra le STDERR où STDOUT va déjà, dans votre cas STDOUT a été redirigé vers un fichier afin que STDERR suive également .. - heemayl


C'est plus une critique de style. Une pratique exemplaire consiste à citer des chaînes que le shell ne doit PAS étendre avec '', et des chaînes que le shell devrait développer avec "". Ainsi plutôt que:

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

Utilisation

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

Aussi votre

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

se fait plus facilement par

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

Vous pouvez également ajouter, après cette ligne:

d3="$(date)"

echo "At $(date) d1=/$d1/,d2=/$d2/, d3=/$d3/" >>/tmp/spammonitor.log

0
2017-08-20 21:40