Signatur
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
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";
}
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";
}
}
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";
}
// 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.