6

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

  1. 检查数据库中的标志值以确定先前的运行是否仍在执行。数据库中的值 1 表示进程仍在运行,而值 0 表示它不是。
  2. 如果标志值为1,则退出PHP else继续下一步。
  3. 将数据库中的标志值从 0 更新为 1。
  4. 执行业务逻辑。
  5. 将标志值从 1 更新回 0,以便如果数据在用户表中可用,则可以执行下一个 CRON。

到目前为止一切正常,根据用户上传数据的大小,该过程平均需要 35 到 40 分钟才能完成。

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

我做了一些谷歌,发现我可以使用一些命令,比如:

Killall -9 PHP

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

4

3 回答 3

6

尝试这个:

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

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

于 2013-08-05T18:12:53.763 回答
1

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

于 2013-08-05T17:46:33.727 回答
1

锁定文件非常适合此任务。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);

?>
于 2013-08-05T18:36:28.340 回答