杀死或停止执行CRON发起的PHP脚本?

时间:2013-08-05 17:35:36

标签: php cron

我已经安排了一个CRON,它每五分钟调用/执行一次PHP脚本。 PHP脚本执行以下任务

  1. 检查数据库中的标志值,以确定先前的运行是否仍在执行。数据库中的值1表示进程仍在运行,而值0表示它不是。
  2. 如果标志值为1,则退出PHP,否则继续执行下一步。
  3. 将数据库中的标志值从0更新为1.
  4. 执行业务逻辑。
  5. 将标志值从1更新回0,以便如果数据在用户表中可用,则可以执行下一个CRON。
  6. 到目前为止一切正常,根据用户上传数据的大小,该过程平均需要35到40分钟才能完成。

    问题,无论如何,一旦cron启动,就会杀死或停止执行PHP脚本。可以是一个按钮,让用户停止执行,上传新数据并等待CRON运行。我可以负责重置所有的标志和数据,这就是我想弄清楚PHP脚本的杀戮。

    我做了一些谷歌,并认为我可以使用一些命令,如:

    Killall -9 PHP
    

    杀死服务器上运行的所有php进程,但不知道如何通过PHP执行此操作。

3 个答案:

答案 0 :(得分:5)

试试这个:

ps aux |grep 'part_of_the_name_of_your_script'|awk '{print $2}' |xargs kill -9 {}

或者在您的crontab文件中使用crun和变量CRUN_TIMEcrun -h

答案 1 :(得分:1)

您可以尝试system()exec(),但它可能无效(或返回权限被拒绝错误),因为当前用户或root执行了cron进程,并且Web服务器用户没有'通常可以访问这些流程。

答案 2 :(得分:1)

lock file非常适合这项任务。 PHP脚本可以尝试创建新文件,如果没有创建,则可以安全地知道该脚本是目前唯一运行的脚本。如果存在文件,则只需退出脚本即可。

示例:

<?php

if (file_exists('/var/run/my-script')) {
    exit(1); // already running
}

file_put_contents('/var/run/my-script', getmypid());

/** Business Logic **/

unlink('/var/run/my-script');
exit(0);

?>