PHP Doku:: Beendet einen von proc_open gestarteten Prozess - function.proc-terminate.html

Verlauf / Chronik / History: (31) anzeigen

Sie sind hier:
Doku-StartseitePHP-HandbuchFunktionsreferenzErweiterungen zur ProzesskontrolleAusführung von SystemprogrammenFunktionen zur Programmausführungproc_terminate

Ein Service von Reinhard Neidl - Webprogrammierung.

Funktionen zur Programmausführung

<<proc_open

shell_exec>>

proc_terminate

(PHP 5)

proc_terminateBeendet einen von proc_open gestarteten Prozess

Beschreibung

bool proc_terminate ( resource $process [, int $signal = 15 ] )

Signalisiert dem process (der mittels proc_open() gestartet wurde), dass er sich beenden soll. proc_terminate() kommt sofort zurück und wartet nicht auf den zu terminierenden Prozess.

proc_terminate() erlaubt es Ihnen, einen Prozess zu beenden und mit anderen Tasks fortzufahren. Sie können den Prozess unter Verwendung der Funktion proc_get_status() pollen (wenn Sie sehen wollen, ob er bereits beendet wurde).

Parameter-Liste

process

Die proc_open()-Ressource, die geschlossen werden soll.

signal

Dieser optionale Parameter ist nur sinnvoll auf POSIX-basierten Betriebssystemen; Sie können ein Signal angeben, das unter Verwendung des kill(2)-Systemaufrufs an den Prozess gesendet wird. Der Standardwert ist SIGTERM.

Rückgabewerte

Gibt den Terminationstatus des laufenden Prozesses zurück.

Changelog

Version Beschreibung
5.2.2 Ältere Versionen wurden verwendet, um das übergebene Prozesshandle resource zu zerstören.

Siehe auch

  • proc_open() - Führt ein Kommando aus und öffnet Dateizeiger für die Ein- und Ausgabe
  • proc_close() - Schließt einen Prozess, der mit proc_open gestartet wurde und gibt den Exitcode dieses Prozesses zurück
  • proc_get_status() - Liefert Informationen über einen mit proc_open gestarteten Prozess


Ein BenutzerBeitrag:
- Beiträge aktualisieren...
jerhee at ucsd dot edu
24.02.2008 5: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);
}

?>



PHP Powered Diese Seite bei php.net
The PHP manual text and comments are covered by the Creative Commons Attribution 3.0 License © the PHP Documentation Group - Impressum - mail("TO:Reinhard Neidl",...)