Справка Cronjob bashscript

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

Любая справка значительно ценилась бы!!

1
задан 20 August 2015 в 21:34

2 ответа

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

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

*/1 * * * * /home/rommy/spam_monitor.sh >/home/rommy/cronresults.txt 2>&1
2
ответ дан 7 December 2019 в 13:54

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

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
0
ответ дан 7 December 2019 в 13:54

Другие вопросы по тегам:

Похожие вопросы: