【问题标题】:Check if a process is running using PHP in Linux检查进程是否在 Linux 中使用 PHP 运行
【发布时间】:2011-06-19 16:06:23
【问题描述】:

我正在使用 kannel 通过 PHP 发送短信。我想知道如何检查特定进程是否正在运行。 kannel 要运行,名为bearerbox 的进程应该一直在运行。我想检查这个过程是否正在运行。因为如果该进程未运行,则会向我发送一封邮件通知我。

【问题讨论】:

  • 你可以使用 php exec 函数
  • 确保外部用户无法修改您的 exec() 调用,如果可能,对它们进行硬编码。糟糕的代码可以让心怀恶意的人访问整个系统。
  • @mattis ,是的,我肯定会记住这一点。 @ldg 感谢朋友的建议,这正是我将要使用的。

标签: php linux daemon kannel


【解决方案1】:

最简单的是使用pgrep,如果进程存在则退出代码为0,否则退出代码为1。

这是一个例子。

exec("pgrep bearerbox", $output, $return);
if ($return == 0) {
    echo "Ok, process is running\n";
}

【讨论】:

  • 谢谢垫子,这正是我想要的。
  • 您可能想检查一下,但从我发现退出代码的方式相反 - 如果存在,则为 1;如果没有,则为 0。谁能澄清一下?
  • @MattFletcher:如果没有找到具有该名称的进程(刚刚尝试过),pgrep 失败(rc=1)。
  • 通过 shell,是的,但我只是在 PHP CLI 中尝试过,它以相反的方式进行。 $output 将返回一个数组,空的或带有每个 PID。回显exec() 命令将返回 PID 或 null。 $return 如果进程不存在则返回 0,如果存在则返回 1!
  • Ps:这是在 Ubuntu 13 上使用 PHP 5.4.9
【解决方案2】:

您可以使用 exec 命令找到您的进程,然后采取相应措施。

类似:

exec('ps aux | grep bearerbox', $output);

您需要确定服务器上返回的内容以确定它是否正在运行。

祝你好运。

【讨论】:

    【解决方案3】:

    有很多方法可以解决这个问题。最简单的(也是对您问题的直接回答)是获取“ps”的输出。

    但恶魔往往总是创建一个“pid”文件。该文件包含守护进程的进程 ID。如果你有,你可以检查文件的内容,看看具有该 id 的进程是否仍在运行。这个比较靠谱。

    supervisord 也可能具有此功能。最后,也许最好获得一个真正的监控系统,而不是自己构建一些东西。 Nagios 可能是一个不错的选择,但可能还有其他选择。

    【讨论】:

      【解决方案4】:

      通过 PHP 监控进程的简单而方便的解决方案:PHP-Linux-Process-Monitor。

      代码目标如下:

      $ps = explode("\n", trim(shell_exec('ps axo pid,ppid,%cpu,pmem,user,group,args --sort %cpu')));
      foreach($ps AS $process){
      $processes[]=preg_split('@\s+@', trim($process), 7 );
      }
      $head= array_shift($processes);
      $processes = array_reverse($processes);
      $output='';
      foreach ($head AS $f) $output.="<td class=\"head\">$f</td>";
      $output=sprintf('<tr class="head">%s</tr>',$output);
      foreach($processes AS $p){
          $output.='<tr>';
          foreach ($p AS $i=>$f){
              if($i==0) $output.=sprintf('<td>%1$s</td>',$f);
              elseif($i==2) $output.=sprintf('<td class="cpu">%1$s<ins style="width:%1$s%%"></ins></td>',$f);
              elseif($i==3) $output.=sprintf('<td class="mem">%1$s<ins style="width="%1$s%%"></ins></td>',$f);
              elseif($i == 6) $output.=sprintf('<td class="command">%1$s</td>',$f);
              else $output.=sprintf('<td>%1$s</td>',$f);
          }
          $output.='</tr>';
      }
      $cpu=implode('&nbsp;&nbsp;&nbsp;', sys_getloadavg());
      $output=sprintf('<table data-cpu="%s" id="process">%s</table>',$cpu, $output);
      

      【讨论】:

        【解决方案5】:

        这是最好的方法

        <?php
        exec("ps -eo comm,pid | awk '$1 == "."\"gs\""." { print $2 }'", $output);
        if ($output != 0) {
            echo "The process gs is running\n";
        }
        ?>
        

        在上面的代码中 gs 是我正在检查的进程

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-04-24
          • 1970-01-01
          • 1970-01-01
          • 2013-07-21
          • 2013-04-22
          • 2014-03-06
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多