10

我有一个执行 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
4

3 回答 3

18

我认为 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');
于 2009-05-12T09:29:03.440 回答
4

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

于 2009-05-12T09:23:31.653 回答
2

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

于 2009-05-12T12:22:11.197 回答