ID:               41003
 Updated by:       [EMAIL PROTECTED]
 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):

[EMAIL PROTECTED] ~]$ 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

[EMAIL PROTECTED] ~]$ 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

Reply via email to