#44994 [Com]: exec() produces zombie processes on Windows, hangs Apache

[email protected] ("jkflash at gmail dot com")
Newsgroups php.bugs
Message-ID <[email protected]>
 ID:               44994
 Comment by:       jkflash at gmail dot com
 Reported By:      dbarrett at vistaprint dot com
 Status:           Assigned
 Bug Type:         Program Execution
 Operating System: Windows 2003 Server, 64-bit
 PHP Version:      5.2.6
 Assigned To:      pajoye
 New Comment:

Sorry, I take that last comment back, it still hangs annoyingly
intermittently with shell_exec as well. It's a killer :(


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

[2008-08-13 01:08:19] jkflash at gmail dot com

PS: shell_exec() DOES seem to work without hanging on my setup, but
none of the others.

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

[2008-08-12 23:50:58] jkflash at gmail dot com

I am experiencing this same problem with PHP 5.2.1 running on IIS as an
ISAPI module on Windows Server 2003 R2 SP2. Intermitently (a handful of
times in a hundred) a process started with exec() will appear to
complete ok but remain running in a zombie state. The IIS worker process
that created the process will not respond to any further requests. I
need to either open a new client browser or kill the worker process.

I get the same result with system, passthru, p_open and proc_open.

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

[2008-07-29 15:03:40] nobody at dontsendmespam dot com

i can reproduce this problem on a debian server with apache2 and
php5.2.6 running as fcgi

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

[2008-07-23 02:02:29] efesar at gmail dot com

I just upgraded from PHP 5.1.2 to 5.2.6, and this exact problem happens
to me. The exec and shell_exec used to work, and now they don't. They
hang the php process, and every subsequent call to exec produces a lost
cmd.exe ... 

Incidentally passthru() causes the same behavior.

Maybe it has something to do with the rotatelogs.exe ... somebody
earlier mentioned that it was waiting on c:\Apache2\logs\error.log ... 


So, basically, we can't run any system calls whatsoever via PHP. I
don't want to use a COM object, because I like portable code ... but
that might be the best step until this bug is fixed.

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

[2008-07-07 18:57:12] stephen dot cuppett at sas dot com

I am also experiencing this problem.  I have been able to recreate it
with system() as well as proc_open().  With proc_open() it doesn't seem
to matter if I set bypass_shell or not, just determines whether I have a
dangling cmd.exe process or not...

cmd.exe seems to stop at Wait:UserReq, but that probably doesn't mean
much.

I am able to reproduce it with XAMPP 1.6.6a (PHP 5.2.5) on Windows XP
or Windows Server 2003 (32-bit).

I don't have much to add in terms of documentation as I don't get
anything in the httpd logs, but using the following code snippet:

                protected function runSAS($filename) {
                                $this->log("Requested to run SAS file:
" . $filename, LOG_DEBUG);

                                $toRun  = "\"" . SAS . "\"";
                                $toRun .= " -sysin '" . $filename .
"'";
                                $toRun .= " -CONFIG '" . SASV9CFG .
"'";
                                $toRun .= " -PRINT '" . TEMP_DIR . "/"
. basename($filename) . ".lst'";
                                $toRun .= " -LOG '" . TEMP_DIR . "/" .
basename($filename) . ".log'";
                                $toRun .= " -NOSPLASH";
                                
                                $this->log("SAS command to run: " .
$toRun, LOG_DEBUG);
                                
                                $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("pipe", "w")
  // stderr is a file to write to
                                );
                                
                                $res = proc_open($toRun,
$descriptorspec, $pipes, null, null, array(/*"bypass_shell" =>
true*/));
                                
                                if (is_resource($res)) {
                                                //fwrite($pipes[0],
"exit\n");
                                                //fflush($pipes[0]);
                                                fclose($pipes[0]);
                                                fclose($pipes[1]);
                                                fclose($pipes[2]);
                                                
                                                $return_value =
proc_close($res);
                                                
                                                $this->log("Return
value from SAS: " . $return_value, LOG_DEBUG);
                                }
                }


When it does seem to complete, I'll get this in my log:

2008-06-26 20:23:55 Debug: Return value from SAS: 1

Nothing should come out on the pipes at all and when I set it up to
read those and it completes, there is no data read.  However, in a hang
case, PHP blocks reading STDOUT instead of on proc_close never getting
any data... even if I set the stream to be non-blocking on the pipe
explicitely after proc_open.

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

The remainder of the comments for this report are too long. To view
the rest of the comments, please view the bug report online at
    http://bugs.php.net/44994

-- 
Edit this bug report at http://bugs.php.net/?id=44994&edit=1
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.