来自 crontab 的 sh 的 php 脚本毫无痕迹地消失

来自 crontab 的 sh 的 php 脚本毫无痕迹地消失

我的 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,所以什么都没有出来。

相关内容