PHP
downloads | documentation | faq | getting help | mailing lists | reporting bugs | php.net sites | links | conferences | my php.net

search for in the

shell_exec> <proc_open
Last updated: Fri, 22 Aug 2008

view this page in

proc_terminate

(PHP 5)

proc_terminateMata un proceso abierto por proc_open

Descripción

bool proc_terminate ( resource $proceso [, int $senyal ] )

Envía una señal al proceso (creado usando proc_open()) indicando que debería terminar. proc_terminate() retorna inmediatamente y no espera a que el proceso termine.

proc_terminate() le permite terminar el proceso y continuar con otras tareas. Puede consultar el estado del proceso (para ver si ya se ha detenido) usando la función proc_get_status(). Sin embargo esto es posible únicamente con PHP 5.2.2 o versiones posteriores, ya que anteriormente se destruía el recurso de proceso dado.

Lista de parámetros

proceso

El valor tipo resource dado por proc_open() que será cerrado.

senyal

Este parámetro opcional es útil solo en sistemas operativos POSIX; es posible especificar una señal la cual enviar al proceso usando la llamada de sistema kill(2). El valor predeterminado es SIGTERM.

Valores retornados

Devuelve el status de terminación del proceso que fue ejecutado.



add a note add a note User Contributed Notes
proc_terminate
jerhee at ucsd dot edu
23-Feb-2008 08:08
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);
}

?>

shell_exec> <proc_open
Last updated: Fri, 22 Aug 2008
 
 
show source | credits | stats | sitemap | contact | advertising | mirror sites