确保Linux上只有一个正在运行的PHP进程

奥列格

我有每分钟从cron运行的php脚本。但有时会超过1分钟。我的问题是:确保现在仅运行一个进程的最佳方法是什么?

我使用以下代码:

$output = shell_exec('ps aux | grep some_script.php | grep -v grep');   //get all processes containing "some_script.php" and exclude current grep process
$trimmed = rtrim($output, PHP_EOL); //trim newline symbol in the end
$processes = explode(PHP_EOL, $trimmed);    //get the array of lines (i.e. processes)
$procCnt = count($processes);   //get number of lines
if ($procCnt > 2) {
  echo "busy\n";
  exit();       //exit if number of processes more than 2 (see explaination below)
}

如果从cron运行一个some_script进程,则shell_exec返回类似以下内容:

apache     13593  0.0  0.0   9228  1068 ?        Ss   18:20   0:00 /bin/bash -c php -f /srv/www/robot/some_script.php 2>&1
apache     13602  0.0  0.0 290640 10544 ?        S    18:20   0:00 php -f /srv/www/robot/some_script.php

所以如果我的输出中有两行以上,我会调用exit()

我想问:我走对了吗?或者,还有更好的方法?

任何帮助,将不胜感激

伊兹方

检查这种方式会创建一个竞争条件,其中两个进程可以同时检索列表,然后两个都决定退出。根据您要执行的操作,这可能是问题,也可能不是问题。

一个更好的替代方法是创建某种类型的锁。我使用的一个简单目录是仅在进程运行时才存在的目录-mkdir是原子的,它将成功(没有其他进程在运行)或失败(另一个进程已经创建了该目录)。只要确保在完成后将其删除即可:

if (!mkdir("lock_dir")) {
   echo "busy\n";
   exit();
}
register_shutdown_function(function() {
   rmdir("lock_dir");
});

或者更好的是,它看起来flock是出于类似的目的。这是手册中的示例:

<?php

$fp = fopen("/tmp/lock.txt", "r+");

if (flock($fp, LOCK_EX)) {  // acquire an exclusive lock
    ftruncate($fp, 0);      // truncate file
    fwrite($fp, "Write something here\n");
    fflush($fp);            // flush output before releasing the lock
    flock($fp, LOCK_UN);    // release the lock
} else {
    echo "Couldn't get the lock!";
}

fclose($fp);

?>

只需按住脚本运行时的锁即可,类似于我的第一个示例。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何确保只有一个 docker 镜像正在运行?

来自分类Dev

htop 提示只有 1 个进程正在运行

来自分类Dev

如何查看Beaglebone上另一个root实例正在运行的进程

来自分类Dev

查找系统单元“拥有”一个正在运行的守护进程

来自分类Dev

在其他进程正在运行python的同时运行一个进程

来自分类Dev

使用 Azure DevOps 进行部署时,多个 DbContexts 但只有一个正在运行

来自分类Dev

node.js如何通过进程名检查一个进程是否正在运行?

来自分类Dev

没有php脚本可以在服务器上运行,而另一个持久的php脚本正在运行

来自分类Dev

没有php脚本可以在服务器上运行,而另一个持久的php脚本正在运行

来自分类Dev

杀死正在运行的进程的所有其他实例(第一个实例除外)

来自分类Dev

AWS ECS。如何确保仅一个任务实例正在运行?

来自分类Dev

只有一个进程正在通过我的互斥锁,而其他进程正在挂起

来自分类Dev

Python多处理:仅一个进程正在运行

来自分类Dev

当另一个进程正在运行时,内核会做什么?

来自分类Dev

另一个ID为#######的进程当前正在运行ngcc

来自分类Dev

当另一个正在运行时,如何打开子进程?

来自分类Dev

使用一个命令杀死正在运行的进程的许多实例

来自分类Dev

一个用于检查预期的Hadoop进程是否正在运行的漂亮工具jps ::问题

来自分类Dev

当线程中的一个进程正在运行时,ProgressDialog不显示

来自分类Dev

一个返回进程ID(如果正在运行)或其他一些输出(如果正在运行)的命令?

来自分类Dev

如何确保只有一个Akka JAR可以在类路径上使用?

来自分类Dev

如何确保只有一个Akka JAR可以在类路径上使用?

来自分类Dev

FreeBSD:如何通过PID检查一个进程中正在运行多少个线程?

来自分类Dev

如何确保对象只有一个线程

来自分类Dev

在脚本中输入并确保只有一个参数

来自分类Dev

只有第一个线程正在使用 python 线程运行

来自分类Dev

有没有办法在Linux系统上暂停正在运行的进程并在以后恢复?

来自分类Dev

与正在运行的php进程进行交互

来自分类Dev

如何确定一个进程是否正在运行,并使用它来制作条件shell脚本?

Related 相关文章

  1. 1

    如何确保只有一个 docker 镜像正在运行?

  2. 2

    htop 提示只有 1 个进程正在运行

  3. 3

    如何查看Beaglebone上另一个root实例正在运行的进程

  4. 4

    查找系统单元“拥有”一个正在运行的守护进程

  5. 5

    在其他进程正在运行python的同时运行一个进程

  6. 6

    使用 Azure DevOps 进行部署时,多个 DbContexts 但只有一个正在运行

  7. 7

    node.js如何通过进程名检查一个进程是否正在运行?

  8. 8

    没有php脚本可以在服务器上运行,而另一个持久的php脚本正在运行

  9. 9

    没有php脚本可以在服务器上运行,而另一个持久的php脚本正在运行

  10. 10

    杀死正在运行的进程的所有其他实例(第一个实例除外)

  11. 11

    AWS ECS。如何确保仅一个任务实例正在运行?

  12. 12

    只有一个进程正在通过我的互斥锁,而其他进程正在挂起

  13. 13

    Python多处理:仅一个进程正在运行

  14. 14

    当另一个进程正在运行时,内核会做什么?

  15. 15

    另一个ID为#######的进程当前正在运行ngcc

  16. 16

    当另一个正在运行时,如何打开子进程?

  17. 17

    使用一个命令杀死正在运行的进程的许多实例

  18. 18

    一个用于检查预期的Hadoop进程是否正在运行的漂亮工具jps ::问题

  19. 19

    当线程中的一个进程正在运行时,ProgressDialog不显示

  20. 20

    一个返回进程ID(如果正在运行)或其他一些输出(如果正在运行)的命令?

  21. 21

    如何确保只有一个Akka JAR可以在类路径上使用?

  22. 22

    如何确保只有一个Akka JAR可以在类路径上使用?

  23. 23

    FreeBSD:如何通过PID检查一个进程中正在运行多少个线程?

  24. 24

    如何确保对象只有一个线程

  25. 25

    在脚本中输入并确保只有一个参数

  26. 26

    只有第一个线程正在使用 python 线程运行

  27. 27

    有没有办法在Linux系统上暂停正在运行的进程并在以后恢复?

  28. 28

    与正在运行的php进程进行交互

  29. 29

    如何确定一个进程是否正在运行,并使用它来制作条件shell脚本?

热门标签

归档