因此,我编写了一个小脚本,用于监控我所服务的目录中是否有任何 PHP 文件发生更改。该脚本被设计为每 5 分钟从 crontab 运行一次,并通过电子邮件向我发送任何更改,以便我可以检查它们。
这台机器上运行着许多网站,我希望能够仔细检查所有新脚本,以确保其中没有我不喜欢的内容,如果你明白我的意思的话。
问题是,当我从命令行运行该脚本时,它 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" [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)。
知道我做错了什么吗?
干杯,
马特。
答案1
脚本中有一个粗俗的说法:[[
换句话说,该脚本使用了 Bourne shell 语法的非标准扩展,这会在运行时破坏脚本/bin/sh
(我假设您的发行版使用了/bin/sh
不支持其中所有非 POSIX bashism 的发行版)。
要解决此问题,请执行以下操作:
- 作为
#!/bin/bash
脚本的第一行 - 使 if 条件看起来像这样:
if [ -s "/root/sec/email" ] ; then
有关 bashisms 的更多信息请参见此处:http://mywiki.wooledge.org/Bashism
答案2
Crontab 默认使用 /bin/sh 来运行您的命令。
尽管 /bin/sh 是 /bin/bash 的符号链接,但如果以这种方式运行,bash 也会禁用仅限 bash 的功能。
根据“man 5 crontab”,您可以在 crontab 文件的新行上放置“SHELL=/bin/bash”,然后 bash 功能就会再次起作用,例如您的“if [[ ... ]]”语句。