我的 crontab 中有一个从凌晨 2:40 开始的脚本,执行一些从 sh 命令和从 sh 文件开始的 php 脚本的例程。
crontab 中的行如下所示:
SHELL=/BIN/BASH
PATH=/sbin:/bin:/usr/sbin:/usr/bin:/mypath
40 2 * * * root run-parts /etc/cron.twoam
在 cron.twoam 文件夹中有一个脚本,我们将其称为 script1:在脚本 1 中调用了一些其他脚本,并且它们执行正常。然后轮到这个脚本,我们将其称为 script2,它是从 script1 调用的。我在 txt 文件和系统日志中都留下了痕迹,以检查发生了什么。
echo "exec script2" >> /mypath/txtlog
/mypath/script2 > /mypath/txtlog2
echo "end of script2" >> /mypath/txtlog
logger -p local1.info "09@ script2 executed"
echo "end of crontwoam" >> /mypath/txtlog
date >> /mypath/txtlog
....其他运行良好的脚本
现在让我们看看 script2 里面有什么:
some scripts....
/mypath/subpath/script3
other scripts...
现在让我们检查一下脚本3:
various php commands
cd /phppath/
php /phppath/myscript.php >> /mypath/myphplog
php /phppath/otherscript.php >> /mypath/myphplog
其他命令
最后是 php 脚本。php 脚本包含各种脚本。除了一个脚本外,其他脚本均正常执行。每当我将其从第 2 行放到第 90 行时,执行都会在那里默默停止。
所以这就是我所做的部分
include("phpscript2.php");
之后的事情就不会被执行。
php phpscripts2.php
如果由我的用户或 root通过命令行执行,phpscripts2.php 可以正常运行。
phpscripts2 里面有(我包括有意义的部分):
echo "已启动 phpscripts2" exec("mysqldump ......"); ftp_connect(); file_get_contents("https://someotherscriptsondifferentserver"); echo "结束 phpscripts2"
现在我在日志中发现:在/mypath/txtlog中我发现了
exec script2
和
end of script 2
在 myphplog 中我发现
started phpscript2
和之后的行
started otherphpscript
我错过了提前结束的 phpscript2 的结尾。phpscript2 的运行时间约为 2 分钟。
我在任何日志中都找不到某些错误的踪迹。我应该在哪里查找?
编辑:
我忘了补充一点,如果创建一个只调用此脚本的 sh 文件,并且我创建一个自定义 crontab 行来调用它仅用于测试,那么一切都会运行。
答案1
您没有在脚本中捕获 stderr,因此应该通过电子邮件发送给 cron 文件的所有者。要捕获 stderr,请使用 2>&1 发送到与 stdout 相同的文件或 2> /some/other/file
正是这个评论让我发现了这个问题。
我在一个文本文件中重定向了 stdErr,终于可以看到它了。我有一个重复的函数,它只在 crontab 中出现。这是因为整个脚本有一系列 require_once 和一个单独的 require。这没什么坏处,直到我在一个常见的必需文件中添加了一个小函数,我才注意到在 require_once 的位置仍然有一个 require。错误当然是从 crontab 发送的,但我还没有设置 sendmail,所以什么都没有出来。