【问题标题】:Find PID of created PHP process in PHP在 PHP 中查找创建的 PHP 进程的 PID
【发布时间】:2012-09-09 13:29:37
【问题描述】:

我先执行如下命令,

 $retVal = proc_close(proc_open("rfcomm connect \/dev\/rfcomm0 &> /dev/null 2> /dev/null &", array(), $pipe));

我必须在 proc_open 之后立即使用 proc_close,否则该命令会挂起我的 php 页面。稍后在我的脚本中,如果我试图找出这个后台进程的 PID,我只会收到我的 grep 请求:

$val = shell_exec("ps aux | grep rfcomm0");

它只返回我的 grep 命令的过程:

www-data 6412 0.0 0.3 2004 624 ? S 12:23 0:00 grep rfcomm0

现在,如果我从 shell_exec 将完全相同的命令输入我服务器上的 SSH 终端,我会得到以下信息:

www-data  6047  0.0  0.3   1752   592 ?        S    12:10   0:00 rfcomm connect /dev/rfcomm0 
root      6415  0.0  0.4   3532   804 pts/1    S+   12:27   0:00 grep rfcomm0

第一个结果是我想要的 PID。是 PHP 无法检索到自己进程的 PID 还是有其他方法可以解开这个谜团?

谢谢!

【问题讨论】:

    标签: php pid


    【解决方案1】:

    通过使用proc_get_status(),可以从pid的值中得到proc_open的进程ID,得到打开的命令进程ID,即父PID的下一个数字(父PID+1):

    $desc = [
        ["pipe","r"],
        ["pipe","w"],
        ["pipe","w"],
        ];
    
    $p = proc_open('php ./process.php', $desc, $pipes);
    $s = proc_get_status($p);
    
    $parentPID = $s['pid'];      // proc_open itself
    $processPID = $s['pid'] + 1; // 'php ./process.php'
    
    proc_close($p);
    

    【讨论】:

      【解决方案2】:

      您可以使用 proc_get_status 获取 PID ...

      http://php.net/manual/en/function.proc-get-status.php

      此函数返回一个数组,其中一个元素是 pid。它的输入参数是proc_open的return ...

      【讨论】:

      • 刚刚也发现了,但是pid相差一个。例如,该函数返回 6622,但实际 PID(如果我查看 ps aux)是 6623。奇怪吧?
      • 有很多关于proc_get_status错误PID的错误报告,也许php版本升级可以解决这个问题?
      • 我刚刚在最后添加了 +1,10 次后它总是返回相同的错误。谢谢!
      • 相同的错误是指相同的错误 PID 或特定的错误消息?如果您有特定的错误消息,请将其发布,它可能会有所帮助。
      • 同样的错误 PID,我在 php.net 手册上读到这是一个已知的错误,尚未修复,+1 不是 100% 保存但可以完成工作 :)
      猜你喜欢
      • 2016-05-08
      • 1970-01-01
      • 1970-01-01
      • 2011-02-02
      • 2012-04-29
      • 2011-01-26
      • 2012-05-12
      • 1970-01-01
      • 2021-11-29
      相关资源
      最近更新 更多