作为 crontab 运行时,Linux Bash IF 条件未处理

Mat*_*ers 3 linux bash cron

因此,我为自己制作了一个小脚本,用于监视我的服务目录中是否存在已更改的任何 PHP 文件。它旨在从 crontab 每 5 分钟运行一次,并将任何更改通过电子邮件发送给我,以便我可以检查它们。

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

问题是当我从命令行运行脚本时,脚本运行 100% 正常,但它不能从 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" matt@aroxo.com muji@aroxo.com < /root/sec/email
        echo "It ran" >> /root/sec/log
else
        echo "It did not run" >> /root/sec/log
fi ;
Run Code Online (Sandbox Code Playgroud)

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

任何想法我做错了什么?

干杯,

马特。

小智 7

该脚本中有一个 bashism: [[

换句话说,该脚本使用了 Bourne shell 语法的非标准扩展,这会在脚本运行时破坏脚本/bin/sh(我假设您的发行版使用了/bin/sh不支持其中所有非 POSIX bashism 的)。

要解决这个问题,要么

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

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