PHP/Cron限制并发运行脚本的数量

PHP/Cron限制并发运行脚本的数量,php,cron,Php,Cron,我有一个用PHP编写的脚本,它是由cron作业启动的。这是一个长时间运行的脚本,cron通常在最后一个实例完成之前启动另一个实例。那很好。我允许在任何给定时间运行此脚本的3个实例 我将脚本限制为3个实例,脚本顶部有以下代码: exec('ps -A | grep nameofmyscript', $results); if (count($results) > 4) { echo "Already Running\n" die(0); } 这很有效,但我正在寻找更好的方法

我有一个用PHP编写的脚本,它是由cron作业启动的。这是一个长时间运行的脚本,cron通常在最后一个实例完成之前启动另一个实例。那很好。我允许在任何给定时间运行此脚本的3个实例

我将脚本限制为3个实例,脚本顶部有以下代码:

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

这很有效,但我正在寻找更好的方法。几周前,当我重命名脚本时,这种方法适得其反,并且忘记更改那行代码。当脚本命名为与已运行的进程类似的名称时,它也会失败。

您可以自动放置名称

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

您可以自动放置名称

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

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

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

这是一个不错的方法。唯一的缺点是我需要另一个定期运行的脚本来清理孤立的pid文件。PHP(或任何与此相关的语言)并不总是完全关闭。@mellowsoon:检查文件修改时间,如果超过5分钟,则删除de PID。(time()-filemtime($path)>5*60)这是一个不错的方法。唯一的缺点是我需要另一个定期运行的脚本来清理孤立的pid文件。PHP(或任何与此相关的语言)并不总是完全关闭。@mellowsoon:检查文件修改时间,如果超过5分钟,则删除de PID。(time()-filemtime($path)>5*60)这是一种比我当前的解决方案更好的方法。我可能不得不使用basename(FILE),因为ps输出中不包含完整路径。但是,它仍然不能防止与系统上运行的同名脚本发生冲突。@mellowsoon啊,是的,
basename()
会更好,我忘记了:P。如果你给我看
ps-A
的输出,我会给你写一个正则表达式,它应该与你的PHP文件完全匹配。@alex,好的。假设脚本的完整路径是/home/mellowsoon/myscript。@mellowsoon所以
/home/mellowsoon/myscript
ps
中的内容吗?
\uuuu FILE\uuuu
给了你什么?@alex,在ps中,它只是myscript。这就是问题所在。系统上可能还有另一个名为myscriptfoo的可执行文件,甚至是myscript。这是一种比我目前的解决方案更好的方法。我可能不得不使用basename(FILE),因为ps输出中不包含完整路径。但是,它仍然不能防止与系统上运行的同名脚本发生冲突。@mellowsoon啊,是的,
basename()
会更好,我忘记了:P。如果你给我看
ps-A
的输出,我会给你写一个正则表达式,它应该与你的PHP文件完全匹配。@alex,好的。假设脚本的完整路径是/home/mellowsoon/myscript。@mellowsoon所以
/home/mellowsoon/myscript
ps
中的内容吗?
\uuuu FILE\uuuu
给了你什么?@alex,在ps中,它只是myscript。这就是问题所在。系统上可能还有另一个名为myscriptfoo的可执行文件,甚至myscript。