2011-02-15 47 views
0

我有一个用cron作业启动的用PHP编写的脚本。这是一个长时间运行的脚本,并且在最后一次完成之前,通常cron会踢出另一个实例。没关系。我允许在任何给定时间运行此脚本的3个实例。PHP/Cron限制并发运行脚本的数量

我限制脚本使用此代码3个实例在脚本的顶部:

exec('ps -A | grep nameofmyscript', $results); 
if (count($results) > 4) { 
    echo "Already Running\n" 
    die(0); 
} 

它的工作原理,但我正在寻找一种更好的方式。这种方法在我重新编写脚本几周之前就对我产生了影响,并忘记更改该代码行。当脚本命名与某个已经运行的进程类似时,它也会失败。

回答

2

使用PHP,您可以创建特定的cron作业目录中的随机命名锁定文件。在让PHP脚本继续之前,检查目录中存在的锁文件的数量。这可能不是最好的解决方案。

1

你可以自动化的名字放置...

exec('ps -A | grep ' . escapeshellarg(basename(__FILE__)) , $results); 
if (count($results) > 4) { 
    echo "Already Running\n" 
    die(0); 
} 
+0

这是比我目前的解决方案更好的方法。我可能必须使用basename(__ FILE__),因为完整路径不包含在ps输出中。但是它仍然不能防止与系统上运行的类似命名的脚本发生冲突。 – mellowsoon 2011-02-15 02:35:04

+0

@mellowsoon啊是的,`basename()`会更好,我忘了:P。如果你向我展示`ps -A`的输出,我会给你写一个正则表达式,它应该完美地匹配你的PHP文件。 – alex 2011-02-15 02:43:38