Start · Sprachen · PHP · Referenz · posix_kill

posix_kill

Funktion

Sendet einem Prozess (oder einer Prozessgruppe) ein POSIX-Signal anhand der Prozess-ID.

seit PHP 4.0.0 Kategorie: misc

Signatur

posix_kill(int $process_id, int $signal): bool

Beschreibung

posix_kill() sendet das angegebene Signal an den Prozess mit der übergebenen Prozess-ID (PID). Die Funktion entspricht dem POSIX-Systemaufruf kill(2) und ist ausschließlich auf POSIX-kompatiblen Systemen (Linux, macOS, BSD usw.) verfügbar – nicht unter Windows.

Typische Anwendungsfälle sind das Beenden von Kindprozessen (z. B. nach einem pcntl_fork()-Aufruf), das Neuladen von Konfigurationen in Daemon-Prozessen via SIGHUP oder das Prüfen, ob ein Prozess noch läuft, indem Signal 0 gesendet wird (kein tatsächliches Signal, aber der Rückgabewert zeigt an, ob der Prozess existiert und erreichbar ist).

Negative Werte für process_id erlauben es, ein Signal an eine gesamte Prozessgruppe zu senden: -1 sendet das Signal an alle Prozesse (sofern die Berechtigungen ausreichen), ein negativer Wert -N sendet es an die Prozessgruppe mit der ID N.

Die Funktion benötigt die PHP-Erweiterung posix (standardmäßig in vielen Distributionen enthalten). Ohne ausreichende Betriebssystemberechtigungen schlägt der Aufruf fehl und gibt false zurück; der genaue Fehlergrund kann mit posix_get_last_error() und posix_strerror() ermittelt werden.

Parameter

Name Typ Default Beschreibung
$process_id Pflicht int Die Prozess-ID (PID) des Zielprozesses. Ein Wert von 0 richtet das Signal an alle Prozesse der aktuellen Prozessgruppe; negative Werte adressieren Prozessgruppen (siehe Beschreibung).
$signal Pflicht int Die Signalnummer, die gesendet werden soll. Gebräuchliche Konstanten: SIGTERM (15, freundliches Beenden), SIGKILL (9, erzwungenes Beenden), SIGHUP (1, Konfiguration neu laden), SIGSTOP (Prozess anhalten). Signal 0 dient ausschließlich der Existenzprüfung des Prozesses.

Rückgabewert

Typ
bool
Beschreibung
Gibt true zurück, wenn das Signal erfolgreich gesendet wurde, andernfalls false. Im Fehlerfall (z. B. unzureichende Berechtigungen oder ungültige PID) liefert posix_get_last_error() den POSIX-Fehlercode.

Beispiele

Kindprozess nach getaner Arbeit sauber beenden

<?php
$pid = pcntl_fork();

if ($pid === -1) {
    die('Fork fehlgeschlagen');
} elseif ($pid === 0) {
    // Kindprozess: Simuliert lang laufende Arbeit
    sleep(60);
    exit(0);
} else {
    // Elternprozess: Wartet 2 Sekunden, beendet dann das Kind
    sleep(2);
    if (posix_kill($pid, SIGTERM)) {
        echo "SIGTERM erfolgreich an PID $pid gesendet.\n";
    } else {
        $errno = posix_get_last_error();
        echo 'Fehler: ' . posix_strerror($errno) . "\n";
    }
    pcntl_wait($status); // Zombie-Prozess vermeiden
    echo "Kindprozess beendet.\n";
}
SIGTERM erfolgreich an PID 12345 gesendet. Kindprozess beendet.

Prüfen, ob ein Prozess noch existiert (Signal 0)

<?php
// PID aus einer PID-Datei lesen (typisch für Daemons)
$pidFile = '/var/run/mydaemon.pid';

if (!file_exists($pidFile)) {
    echo "PID-Datei nicht gefunden.\n";
    exit(1);
}

$pid = (int) file_get_contents($pidFile);

if (posix_kill($pid, 0)) {
    echo "Daemon läuft noch (PID: $pid).\n";
} else {
    $errno = posix_get_last_error();
    if ($errno === POSIX_ESRCH) {
        echo "Prozess $pid existiert nicht mehr.\n";
    } elseif ($errno === POSIX_EPERM) {
        echo "Prozess $pid existiert, aber keine Berechtigung.\n";
    }
}
Daemon läuft noch (PID: 4711).

SIGHUP zum Neuladen der Konfiguration senden

<?php
// Nginx-Konfiguration neu laden, ohne den Prozess zu beenden
$pid = (int) file_get_contents('/var/run/nginx.pid');

if (posix_kill($pid, SIGHUP)) {
    echo "Nginx-Konfiguration erfolgreich neu geladen (PID: $pid).\n";
} else {
    echo 'Fehler: ' . posix_strerror(posix_get_last_error()) . "\n";
}
Nginx-Konfiguration erfolgreich neu geladen (PID: 1337).

// Wichtig · Fallstricke

Nur auf POSIX-Systemen verfügbar: Die Funktion ist unter Windows nicht implementiert. Ein Aufruf auf Windows-Systemen führt zu einem fatalen Fehler.

Berechtigungen: Um einem fremden Prozess ein Signal zu senden, muss der PHP-Prozess entweder als root laufen oder die gleiche UID wie der Zielprozess besitzen. Andernfalls schlägt der Aufruf mit EPERM fehl.

SIGKILL und SIGSTOP: Diese Signale können vom Zielprozess nicht abgefangen oder ignoriert werden. SIGKILL beendet den Prozess sofort ohne Aufräumen – bevorzuge im Normalfall SIGTERM, um dem Prozess die Möglichkeit zu geben, Ressourcen freizugeben.

Zombie-Prozesse: Nach dem Beenden eines Kindprozesses sollte der Elternprozess pcntl_wait() oder pcntl_waitpid() aufrufen, um den Zombie-Prozess aus der Prozesstabelle zu entfernen.