#41003 [Opn->Bgs]: proc_get_status - PID is -1 out
| From: | iliaa@php.net | Date: | Sun, 08 Apr 2007 15:14:23 +0000 |
| Subject: | #41003 [Opn->Bgs]: proc_get_status - PID is -1 out | ||
| References: | 1 | Groups: | php.bugs |
| Request: | Send a blank email to php-bugs+get-111217@lists.php.net to get a copy of this message | ||
ID: 41003
Updated by: iliaa@php.net
Reported By: andy dot shellam at mailnetwork dot co dot uk
-Status: Open
+Status: Bogus
Bug Type: POSIX related
Operating System: Unix (FreeBSD)
PHP Version: 5.2.1
New Comment:
Thank you for taking the time to write to us, but this is not
a bug. Please double-check the documentation available at
http://www.php.net/manual/ and the instructions on how to
report
a bug at http://bugs.php.net/how-to-report.php
PHP started the ./loop.sh script, which is why its PID is returned. The
other command was initiated by the shell script and PHP has no way of
knowing about it.
Previous Comments:
------------------------------------------------------------------------
[2007-04-05 12:09:38] andy dot shellam at mailnetwork dot co dot uk
Description:
------------
proc_get_status when run with a proc_open'd resource returns a PID that
is one less than shown in ps output.
E.g. to kill a process opened by proc_open, you need to add 1 to the
PID returned by proc_get_status for it to work.
This is because proc_get_status returns the PID of the shell that then
runs the command - not the command process itself.
Reproduce code:
---------------
Create a bash script that loops endlessly to simulate a long-running:
#!/usr/local/bin/bash
while [ 0 -eq 0 ]; do
let 0
done
In PHP, run this script (from CLI):
#!/usr/local/php/bin/php
<?php
$descriptorspec = array(
0 => array("pipe", "r"), // stdin is a pipe that the child will
read from
1 => array("pipe", "w"), // stdout is a pipe that the child will
write to
2 => array("file", "/tmp/error-output.txt", "a") // stderr is a
file
to write to
);
$cwd = '/tmp';
$env = array('some_option' => 'aeiou');
$process = proc_open('/tmp/loop.sh', $descriptorspec, $pipes, $cwd,
$env, Array("bypass_shell" => TRUE));
if (is_resource($process)) {
$procinfo = proc_get_status($process);
echo "Opened process ID is: " . $procinfo['pid'] . "\n";
}
?>
Expected result:
----------------
Opened process ID is: 40609
(from ps output):
[NetServe@sydney ~]$ sudo ps auxwww|grep loop.sh
root 40609 48.2 0.2 3036 1672 p0 R+ 1:06PM 0:05.94
/usr/local/bin/bash /tmp/loop.sh
root 40608 0.0 0.1 1632 988 p0 S+ 1:06PM 0:00.00 sh
-c /tmp/loop.sh
Actual result:
--------------
Opened process ID is: 40608
[NetServe@sydney ~]$ sudo ps auxwww|grep loop.sh
root 40609 48.2 0.2 3036 1672 p0 R+ 1:06PM 0:05.94
/usr/local/bin/bash /tmp/loop.sh
root 40608 0.0 0.1 1632 988 p0 S+ 1:06PM 0:00.00 sh
-c /tmp/loop.sh
As you can see, the PID returned by proc_get_info is the shell that is
then used to start the actual command - if you kill the shell's PID, the
command carries on running. Kill the shell PID+1, and it kills both
off.
This is similar to http://bugs.php.net/bug.php?id=40070, however the
bypass_shell does not work on Unix.
------------------------------------------------------------------------
--
Edit this bug report at http://bugs.php.net/?id=41003&edit=1