【问题标题】:PHP/Cron Limit Number of Concurrently Running ScriptsPHP/Cron 限制并发运行脚本数
【发布时间】:2012-12-24 17:40:30
【问题描述】:

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

我将脚本限制为 3 个实例,并在脚本顶部使用此代码:

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

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

【问题讨论】:

    标签: php cron


    【解决方案1】:

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

    【讨论】:

    • 这不是一个坏方法。唯一的缺点是我需要另一个定期运行的脚本来清理孤立的 pid 文件。 PHP(或任何语言)并不总是干净利落地关闭。
    • @mellowsoon:检查文件修改时间,如果大于5分钟删除de PID。 (time() - filemtime($path) > 5*60)
    【解决方案2】:

    您可以自动放置名称...

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

    【讨论】:

    • 这比我目前的解决方案更好。我可能不得不使用 basename(FILE),因为完整路径不包含在 ps 输出中。但是,它仍然不能防止与系统上运行的类似名称的脚本发生冲突。
    • @mellowsoon 啊,是的,basename() 会更好,我忘了:P。如果你给我看ps -A的输出,我会给你写一个正则表达式,它应该与你的PHP文件完美匹配。
    • @alex,好的。假设脚本的完整路径是 /home/mellowsoon/myscript。
    • @mellowsoon 那么/home/mellowsoon/myscriptps 中的内容吗? __FILE__ 带给你什么?
    • @alex,在 ps 中它只是 myscript。这是问题所在。系统上可能还有另一个名为 myscriptfoo 的可执行文件,甚至是 myscript。
    猜你喜欢
    • 2011-02-18
    • 2014-11-01
    • 1970-01-01
    • 2018-07-05
    • 2019-07-23
    • 1970-01-01
    • 1970-01-01
    • 2018-03-22
    • 1970-01-01
    相关资源
    最近更新 更多