2013-08-05 85 views
5

我已经安排了一个CRON,每五分钟调用/执行一次PHP脚本。 PHP脚本执行以下任务杀死或停止执行由CRON启动的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做到这一点。

回答

1

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

4

试试这个:

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

或者在crontab文件使用CRUN和可变CRUN_TIME 看到crun -h

+1

杀手一个衬垫,谢谢。 我得到'{}'的错误,当我删除它时,命令有效。 –

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); 

?> 
+0

谢谢,但我不确定这是否能解决问题。你建议使用锁定文件来检查脚本是否已经运行。我能够在数据库标志的帮助下管理它(效率不高,但现在正在工作)。我正在寻找的是一种脚本开始处理业务逻辑后停止执行的方法。 – Saurabh