Cronjob bashscript 帮助

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”以进行测试。我不希望将来一封电子邮件触发 postfix 关闭。

以下是我的 crontab 的样子:

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

crontab 中的上述命令后面有一行额外的命令。cronresults.txt 中没有任何内容。我现在每分钟运行一次以进行测试。在生产中它不会运行得那么频繁。

任何帮助将不胜感激!!

答案1

您使用&>来重定向 STDOUT 和 STDERR,这是一种bash主义。由于 的默认 shell cron(与您的脚本 shebang 不同)shdash在 Ubuntu 中),它不理解&>语法。因此,它将&shell 脚本视为后台作业。

为了解决这个问题,请使用可移植的重定向方式:

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

答案2

这更像是一种风格批评。最佳实践是引用 shell 不应使用 '' 扩展的字符串,以及应使用 "" 扩展的字符串。因此,而不是:

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

相关内容