使用 PHP 中的父 PID 获取子 PID
Get Children PID using Parent PID from PHP
对于上下文:我正在使用 xvfb-run
从 PHP 生成一个 Java 应用程序。现在,此进程为 xvfb-run
创建一个父 PID,并耦合更多对应于 Xvfb
和 java
进程的子 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。我尝试了 exec
、shell_exec
、system
等。我尝试的脚本是:
$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
对于上下文:我正在使用 xvfb-run
从 PHP 生成一个 Java 应用程序。现在,此进程为 xvfb-run
创建一个父 PID,并耦合更多对应于 Xvfb
和 java
进程的子 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。我尝试了 exec
、shell_exec
、system
等。我尝试的脚本是:
$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)
我在这里错过了什么?任何指针都会有所帮助。提前致谢
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