我有一份cron
工作,执行如下的 shell 脚本
00 01 * * * sh /backup/script.sh
现在我需要添加一个功能,cron
以便如果该脚本不存在,那么它会使用sendmail
实用程序通过电子邮件向我生成警报。
就像是
00 01 * * * find script and execute script or if find no result then email.
答案1
我看到两种通用解决方案。一种是让 cron 通知您它运行的命令的结果。具体来说,crontab(5) 手册页指出
如果 cron(8) 有理由在“此”crontab 中运行命令后发送邮件,它将查看 MAILTO。如果定义了 MAILTO(且非空),则将向指定用户发送邮件。
只需在 crontab 文件的开头添加如下一行:
[email protected]
或者,如果您想要一个更专业的解决方案,您可以创建一个脚本并将其放在可以保证找到的位置(例如/bin
)。脚本本身会检查实际脚本是否存在,如果是,则运行它,如果不存在,则向您发送通知。类似以下内容:
#!/bin/bash
myscript=/path/to/your/script
[email protected]
if [ -f "$myscript" ] ; then
exec "$myscript"
else
mail -s "Error running $myscript" $myemail <<EOF
There was an error running the script
$myscript
The script could not be found
EOF
fi
你甚至可以让它变得通用:
#!/bin/bash
myscript=$1
shift 1
params=$*
[email protected]
if [ -f "$myscript" ] ; then
exec "$myscript $*"
else
mail -s "Error running $myscript" $myemail <<EOF
There was an error running the script
$myscript
The script could not be found
EOF
fi
答案2
cron 已经为你做了这件事。你的 crontab 条目显示:
00 01 * * * sh /backup/script.sh
在预定的时间,cron 将执行您指定的命令并通过电子邮件向您发送其输出。
的输出sh /does/not/exist
为:sh: 0: Can't open /does/not/exist
。因此,如果文件不存在,cron 将通过电子邮件向您发送以下内容。
您可能需要确保您的系统已正确配置电子邮件,以便 cron 能够成功向您发送电子邮件。您提到了 sendmail;如果 sendmail 配置正确,并且能够向您的用户发送电子邮件,那么 cron 也将正常工作。
MAILTO
如果您需要向其他地址发送电子邮件,或者无法向用户发送电子邮件,但可以向特定的 Internet 电子邮件地址发送电子邮件,此变量也会有所帮助。只需[email protected]
在现有行上方添加此行即可。
答案3
好吧,你需要另一个脚本。像这样:
#!/bin/bash
file="/path/to/script.sh"
# if script.sh exists and is executable.
if [ -x $file ]; then
# execute script.sh
sh /path/to/script.sh
else
#send mail
echo "script.sh doesn't exists or is not executable" | sendmail [email protected]
fi