ID:               41003
 User updated by:  andy dot shellam at mailnetwork dot co dot uk
 Reported By:      andy dot shellam at mailnetwork dot co dot uk
 Status:           Bogus
 Bug Type:         POSIX related
 Operating System: Unix (FreeBSD)
 PHP Version:      5.2.1
 New Comment:

Sorry that might have been a bad example, but even without a shell
script (i.e. an executable) a shell process is still launched to run
that process.

You are correct, PHP is returning the ID of the process it launches
(the shell.)  But can this not be changed as it is in the Windows
version, so you can (optionally) bypass the shell and launch the process
directly, as that would then return the correct PID of the process
itself?

I.e. in Windows PHP is launching cmd.exe, in Unix it's launching sh. 
In the Windows version there's an option to bypass cmd.exe and launch
the process directly.  Can't you do the same for Unix?


Previous Comments:
------------------------------------------------------------------------

[2007-04-08 15:14:23] [EMAIL PROTECTED]

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.

------------------------------------------------------------------------

[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