从PHP调用外部shell脚本并获取其进程ID

时间:2009-09-24 10:47:28

标签: php external-process

如何从PHP本身调用外部shell脚本(或者外部PHP脚本)并在同一脚本中获取其进程ID?

4 个答案:

答案 0 :(得分:39)

$command =  'yourcommand' . ' > /dev/null 2>&1 & echo $!; ';

$pid = exec($command, $output);

var_dump($pid);

答案 1 :(得分:17)

如果你想严格使用PHP提供的工具,而不是Unix-specific wizardry,你可以使用proc_openproc_get_status来完成这项工作,尽管需要将描述符规范传递给proc_open使用起来令人不快:

<?php

$descriptorspec = [
    0 => ['pipe', 'r'],
    1 => ['pipe', 'w'],
    2 => ['pipe', 'w']
];
$proc = proc_open('yourcommand', $descriptorspec, $pipes);
$proc_details = proc_get_status($proc);
$pid = $proc_details['pid'];

echo $pid;

答案 2 :(得分:2)

对于跨平台解决方案,请查看symfony/process

use Symfony\Component\Process\Process;
$process = new Process('sleep 100');
$process->start();
var_dump($process->getPid());

使用作曲家(symfony/process)安装composer require symfony/process后,您可能需要使用composer dump-autoload更新自动加载信息,然后要求自动加载require __DIR__ . '/vendor/autoload.php';

另请注意,您只能获取正在运行进程的PID。有关API的详细信息,请参阅the documentation

答案 3 :(得分:0)

最终为我工作的是使用pgrep获取在PHP中调用exec()后执行的命令(或进程名)的PID。

exec($command);
$pid = exec("pgrep $command");

这也适用于启动后台进程。但是,您必须记住将程序的输出传递给/dev/null,否则PHP将挂起。另外,在调用pgrep时,不能包含命令的管道部分:

$command = "bg_process -o someOption";
exec($command + " > /dev/null &"); //Separate the pipe and '&' from the command
$pid = exec("pgrep $command");

请注意,如果系统使用相同的确切命令启动了多个进程,则它将返回与给pgrep的命令匹配的所有进程的PID。如果仅传递进程名称,它将返回具有该进程名称的所有PID。

相关问题