note 81353 added to function.proc-terminate

From: Date: Sun, 24 Feb 2008 04:08:10 +0000
Subject: note 81353 added to function.proc-terminate
Groups: php.notes 
Request: Send a blank email to php-notes+get-136449@lists.php.net to get a copy of this message
As explained in http://bugs.php.net/bug.php?id=39992, proc_terminate() leaves children of the child process running. In my application, these children often have infinite loops, so I need a sure way to kill processes created with proc_open(). When I call proc_terminate(), the /bin/sh process is killed, but the child with the infinite loop is left running. Until proc_terminate() gets fixed, I would not recommend using it. Instead, my solution is to: 1) call proc_get_status() to get the parent pid (ppid) of the process I want to kill. 2) use ps to get all pids that have that ppid as their parent pid 3) use posix_kill() to send the SIGKILL (9) signal to each of those child pids 4) call proc_close() on process resource <?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('pipe', 'w') // stderr is a pipe the child will write to ); $process = proc_open('bad_program', $descriptorspec, $pipes); if(!is_resource($process)) { throw new Exception('bad_program could not be started.'); } //pass some input to the program fwrite($pipes[0], $lots_of_data); //close stdin. By closing stdin, the program should exit //after it finishes processing the input fclose($pipes[0]); //do some other stuff ... the process will probably still be running //if we check on it right away $status = proc_get_status($process); if($status['running'] == true) { //process ran too long, kill it //close all pipes that are still open fclose($pipes[1]); //stdout fclose($pipes[2]); //stderr //get the parent pid of the process we want to kill $ppid = $status['pid']; //use ps to get all the children of this process, and kill them $pids = preg_split('/\s+/', ps -o pid --no-heading --ppid $ppid); foreach($pids as $pid) { if(is_numeric($pid)) { echo "Killing $pid\n"; posix_kill($pid, 9); //9 is the SIGKILL signal } } proc_close($process); } ?> ---- Server IP: 209.41.74.194 Probable Submitter: 128.54.176.156 ---- Manual Page -- http://www.php.net/manual/en/function.proc-terminate.php Edit -- https://master.php.net/note/edit/81353 Del: integrated -- https://master.php.net/note/delete/81353/integrated Del: useless -- https://master.php.net/note/delete/81353/useless Del: bad code -- https://master.php.net/note/delete/81353/bad+code Del: spam -- https://master.php.net/note/delete/81353/spam Del: non-english -- https://master.php.net/note/delete/81353/non-english Del: in docs -- https://master.php.net/note/delete/81353/in+docs Del: other reasons-- https://master.php.net/note/delete/81353 Reject -- https://master.php.net/note/reject/81353 Search -- https://master.php.net/manage/user-notes.php

« previous php.notes (#136449) next »