Linux Bash IF条件在作为crontab运行时没有处理

所以我做了一个小脚本来监视我所服务的目录中的任何已经改变的PHP文件。 它的目的是从crontab运行每5分钟,并发送给我任何更改,以便我可以检查它们。

机器上有很多网站在运行,我希望能够看到任何新的脚本,以确保没有任何我不喜欢的外观,如果你知道我的意思。

问题是脚本从命令行运行时运行正常,但是它不能从crontab正确运行。 脚本包含在下面:

rm /root/sec/email find /var/www/ -name '*.php' -not -name '*.tpl.*' -type f -mtime -0.005 -exec ls -al {} \; > /root/sec/email if [[ -s /root/sec/email ]] ; then mail -s "PHP Change Alert on FSE4" [email protected] [email protected] < /root/sec/email echo "It ran" >> /root/sec/log else echo "It did not run" >> /root/sec/log fi ; 

问题在于IF条件。 即使名为“email”的文件的大小不为零,if子句的错误一边也会触发(else)。

任何想法我做错了什么?

干杯,

马特。

剧本里面有一个抨击: [[

换句话说,脚本对Bourne shell语法使用了非标准的扩展,当脚本运行在/bin/sh时,脚本会被中断(我假设你的发行版使用的是/bin/sh ,它不支持所有的在它的非POSIX bashisms)。

要解决这个问题,要么

  1. #!/bin/bash放在脚本的第一行
  2. 使if条件如下所示: if [ -s "/root/sec/email" ] ; then if [ -s "/root/sec/email" ] ; then

有关bashisms的更多信息在这里: http ://mywiki.wooledge.org/Bashism

Crontab默认使用/ bin / sh来运行你的命令。

即使/ bin / sh是/ bin / bash的符号链接,如果以这种方式运行,bash将禁用仅限bash的function。

根据'man 5 crontab',你可以把'SHELL = / bin / bash'换成你的crontab文件的新行,突然bash特性会再次起作用,比如你的“if [[…]]”语句。