Reputation: 25637
How can I invoke an external shell script (Or alternatively an external PHP script) from PHP itself and get its process ID within the same script?
Upvotes: 31
Views: 29256
Reputation: 812
What ended up working for me is using pgrep
to get the PID of the command (or process name) executed after calling exec()
in PHP.
exec($command);
$pid = exec("pgrep $command");
This will work for launching background processes too. However, you must remember to pipe the program's output to /dev/null
or else PHP will hang. Also, when calling pgrep
you can't include the pipe portion of the command:
$command = "bg_process -o someOption";
exec($command + " > /dev/null &"); //Separate the pipe and '&' from the command
$pid = exec("pgrep $command");
Note that if the system has multiple processes launched with the same exact command, it will return the PIDs of all processes which match the command given to pgrep
. If you only pass in a process name, it will return all PIDs with that process name.
Upvotes: 0
Reputation: 2580
For a cross-platform solution, check out symfony/process.
use Symfony\Component\Process\Process;
$process = new Process('sleep 100');
$process->start();
var_dump($process->getPid());
After you install symfony/process
with composer (composer require symfony/process
), you may need to update autoloading info with composer dump-autoload
and then require the autoload with require __DIR__ . '/vendor/autoload.php';
.
Notice also that you can get PID of a running process only. Refer to the documentation for API details.
Upvotes: 3
Reputation: 155206
If you want to do this strictly using tools PHP gives you, rather than Unix-specific wizardry, you can do so with proc_open
and proc_get_status
, although the need to pass a descriptor spec into proc_open
makes it unpleasantly verbose to use:
<?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;
Upvotes: 27
Reputation: 47624
$command = 'yourcommand' . ' > /dev/null 2>&1 & echo $!; ';
$pid = exec($command, $output);
var_dump($pid);
Upvotes: 62