在 Crontab 中使用 If 语句生成警报

在 Crontab 中使用 If 语句生成警报

我有一台服务器,其中大约有 100 个运行各种 PHP 脚本的 Cron 作业。当前的任务是在 PHP 脚本执行过程中发生错误时生成警报。

Cron 设置如下:

30 08 * * * /usr/bin/php /var/www/html/phpscirpt1.php > /var/www/html/phpscript1.log 2>&1

我尝试的是&&在最后放置一个,但这无论如何都会生成警报电子邮件

30 08 * * * /usr/bin/php /var/www/html/phpscript1.php > /var/www/html/phpscript1.log 2>&1 && <Generate Mail>

应该有效的理想情况是

 /bin/bash /home/myUser/testfile.sh > /home/myUser/testfile.log 2>&1 ; [$? == 1] && /bin/bash script.sh

以下只是一个用于测试目的的示例,当

/bin/bash /home/myUser/testfile.sh > /home/myUser/testfile.log 2>&1

执行testfile.sh仅创建一个目录。第一次执行上述命令时echo $?会给出输出0,但再次运行该命令会返回1,因为脚本返回并记录错误

mkdir: cannot create directory `/home/myUser/testdir': File exists

基本上,这就是所需要的,即每当 cron 中的脚本失败时,它应该以电子邮件的形式生成警报。上面的示例script.sh包含一个mail -s发送电子邮件的命令。

但是当执行完整的命令时,会返回错误,如下所示

/bin/bash /home/myUser/testfile.sh > /home/myUser/testfile.log 2>&1 ; [$? == 1] && /bin/bash script.sh
-bash: [1: command not found

我将非常感谢为解决此错误提供的任何指导。谢谢

答案1

基本上你的解决方案是好的。您刚刚犯了简单的 bash 语法错误。您必须在“[”和“]”字符周围放置空格:

[ $? == 1 ]

我已经在我的盒子上测试过它并且有效。我还建议测试错误代码不等于 0 ([ $? -ne 0]),除非您确定只想对错误代码 1 做出反应。

答案2

以下任何一项都应该有效:

30 08 * * * /usr/bin/php /var/www/html/phpscript1.php > /var/www/html/phpscript1.log 2>&1 || <Generate Mail>
30 08 * * * /usr/bin/php /var/www/html/phpscript1.php > /var/www/html/phpscript1.log 2>&1 ; [ $? -ne 0 ] && <Generate Mail>

第一个使用逻辑 OR||而不是逻辑 AND &&,它基于脚本的返回值(0 表示成功,其他表示失败)。

[第二个需要在和之间留有空间$?才能正常工作。

相关内容