0

我首先执行以下命令,

 $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-数据 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 还是有其他方法可以解决这个谜团?

谢谢!

4

2 回答 2

2

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

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

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

于 2012-09-17T10:37:57.713 回答
-1

通过 usgin proc_get_status(),您可以proc_openpidvalue 中获取进程 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);
于 2018-09-27T06:09:17.927 回答