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