Cronjob bashscript help

Я просмотрел кучу руководств по устранению неполадок cronjob, но я не могу понять, что я делаю неправильно. Этот скрипт работает нормально, если я запускаю его вручную. Запуск его из crontab просто не работает. Вот как выглядит скрипт:

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

Сценарий установлен как исполняемый (chmod u+x) и принадлежит пользователю root:root. Он работает каждый раз, когда я запускаю его вручную. У меня есть условное значение "1" прямо сейчас для тестирования. Я не хочу, чтобы 1 электронное письмо вызывало отключение постфикса в будущем.

Вот как выглядит мой crontab:

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

После этой команды в crontab есть дополнительная строка. Ничто никогда не появляется в cronresults.txt. Я запускаю его каждую минуту прямо сейчас для тестирования. Это не будет работать так часто в производстве.

Любая помощь будет принята с благодарностью!

2 ответа

Ты используешь &> для перенаправления как STDOUT, так и STDERR, который является bashизм. В качестве оболочки по умолчанию для cron (не то же самое, что ваши сценарии Шебанг) sh (который dash в Ubuntu) не понимает &> синтаксис. В результате это лечит & поместить сценарий оболочки в качестве фонового задания.

Чтобы преодолеть это, используйте переносимый способ перенаправления:

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

Это больше стиль критики. Рекомендуется заключать в кавычки строки, которые оболочка НЕ ​​должна раскрывать с помощью '', и строки, которые оболочка должна раскрывать с помощью "". Таким образом, а не:

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

использование

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

Кроме того, ваш

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

легче сделать

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

Вы также можете добавить после этой строки:

d3="$(date)"

echo "At $(date) d1=/$d1/,d2=/$d2/, d3=/$d3/" >>/tmp/spammonitor.log
Другие вопросы по тегам