使用 PHP 中的父 PID 获取子 PID

Get Children PID using Parent PID from PHP

对于上下文:我正在使用 xvfb-run 从 PHP 生成一个 Java 应用程序。现在,此进程为 xvfb-run 创建一个父 PID,并耦合更多对应于 Xvfbjava 进程的子 PID。

使用以下命令,我设法获得了父 PID(xvfb-run):

$cmd1 = 'nohup xvfb-run -a java -jar some.jar > /dev/null 2>&1 & echo $!';
$res1 = trim(shell_exec($cmd1));

var_dump($res1);  // Returns the parent PID. For eg: 26266

现在,一旦 Java 进程完成,我将需要终止 Java 进程,以释放我的服务器资源。 (Java 应用程序是基于 GUI 的,我设法在不使用 GUI 控制的情况下让它工作,但我仍然可以关闭它,只能使用 kill -9 <pid>

现在,从终端,I can get the Children pid 使用:

pgrep -P 26266

并且,它将 return 我的 pids 如下:

26624
26633

但是,当我尝试使用 PHP 执行相同操作时,我无法获取这些 pid。我尝试了 execshell_execsystem 等。我尝试的脚本是:

$cmd2 = 'pgrep -P ' . $res1;
var_dump($cmd2);
$res2 = trim(exec($cmd2, $o2, $r2));
var_dump($res2);
var_dump($o2);
var_dump($r2);

它打印出以下内容:

string(14) "pgrep -P 26266" string(0) "" array(0) { } int(1)

我在这里错过了什么?任何指针都会有所帮助。提前致谢

在 PHP 中执行 exec 时,

pgrep -P 方法无效。所以,我用 another approach 得到 children pid(s):

ps --ppid <pid of the parent>

示例 PHP 代码为:


// Get parent pid and children pid in an array
$pids = [3551]; // Add parent pid here. Eg: 3551

// Call the bash command to get children pids and store in $ps_out variable
exec('ps --ppid ' . $pids[0], $ps_out);

// Loop and clean up the exec response to extract out children pid(s)
for($i = 1; $i <= count($ps_out) - 1; $i++) {
    $pids[] = (int)(preg_split('/\s+/', trim($ps_out[$i]))[0]);
}

var_dump($pids); // Dump to test the result