Я просмотрел набор 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. У меня есть он работающий каждую минуту прямо сейчас за тестированием. Это не будет работать так часто в производстве.
Любая справка значительно ценилась бы!!
Вы используете &>
для перенаправления и 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