cron 作业会杀死最后一个 cron 执行吗?

Posted

技术标签:

【中文标题】cron 作业会杀死最后一个 cron 执行吗?【英文标题】:Does a cron job kill last cron execution? 【发布时间】:2010-10-25 12:15:55 【问题描述】:

我有一个执行 php 脚本的 cron 作业。 cron 设置为每分钟运行一次,这仅用于测试目的。它正在执行的 PHP 脚本旨在将用户上传到服务器的视频转换为 flash 格式(例如....flv)。通过命令行手动执行该脚本时,该脚本执行良好,但是通过 cron 执行时,它开始正常,但一分钟后它就停止了。

似乎在执行下一个 cron 时,它会“杀死”最后一个 cron 执行。 我添加了以下 PHP 函数:

ignore_user_abort(true);

希望它不会中止最后一次执行,我测试了将 cron 设置为每 5 分钟运行一次,效果很好,但是视频的转换可能需要 5 分钟以上,所以我需要弄清楚为什么它在什么时候停止另一个 cron 被执行。

任何帮助将不胜感激。

谢谢!

编辑: 我的 cron 看起来像:

*/1 * * * * php /path_to_file/convert.php

【问题讨论】:

你检查过 PHP 错误日志吗?你有没有使用 set_time_limit 将时间限制设置为 0? 没有错误出现,我也将时间限制设置为0。我忘了提早我的 cron 看起来像:
 */1 * * * * php /path_to_file/convert.php 
谢谢!
看来 cron 作业没有覆盖上一次正在工作的内容,PHP 代码中有问题。我添加了一个检查以确保它退出,但是添加了一个 Sander 提到的临时锁定文件非常有效。谢谢! 【参考方案1】:

我认为 cron 不会杀死任何进程。但是,cron 并不真正适合长时间运行的进程。这里可能发生的情况是,您的脚本在多次执行时会完全践踏自己。例如,两个 PHP 进程可能试图同时写入同一个文件。

首先,确保您不仅查看 php 错误日志,还尝试从 PHP 文件本身捕获输出。例如:

*/1 * * * * * php /path/to/convert.php & >> /var/log/convert.log

您还可以使用简单的锁定文件来确保不会多次执行 convert.php。比如:

if (file_exists('/tmp/convert.lock')) 
    exit();


touch('/tmp/convert.lock');
// convert here
unlink('/tmp/convert.lock');

【讨论】:

cron 不会杀死进程。脚本(或脚本调用的东西)以它自己的方式进入。【参考方案2】:

cron 本身不会停止先前运行的作业实例,因此,如果出现问题,几乎可以肯定您的 PHP 中有一些东西在做这件事。您需要发布该代码。

【讨论】:

【参考方案3】:

不,不会。您可以通过创建脚本在每次运行时检查的锁定文件来阻止第二个进程运行。如果文件存在,则不会运行。如果合适的话,这也应该与最大执行时间一起使用,这样一个进程就不会无限期地停止未来的执行。锁定文件可以只是一个名为 /tmp/foo.lock 的空纯文本文件。

【讨论】:

以上是关于cron 作业会杀死最后一个 cron 执行吗?的主要内容,如果未能解决你的问题,请参考以下文章

为啥成功执行 Cron 作业会停止将日志进一步附加到文件中

Cron 作业可以使用 Gnome-Open 吗?

Laravel 中的 Cron 作业 [重复]

一个永远不会执行的 cron 作业

从特定时区的给定日期起每 14 天执行一次作业的 Cron 脚本

如何记录 cron 作业?