Ich bin kürzlich in einem Shell-Skript darauf gestoßen.
if ! kill -0 $(cat /path/to/file.pid); then
... do something ...
fi
Was macht kill -0 ...
das?
kill -0 $pid
ein Shell-Skript? sowie Was macht Kill 0 eigentlich? .
Ich bin kürzlich in einem Shell-Skript darauf gestoßen.
if ! kill -0 $(cat /path/to/file.pid); then
... do something ...
fi
Was macht kill -0 ...
das?
kill -0 $pid
ein Shell-Skript? sowie Was macht Kill 0 eigentlich? .
Antworten:
Dieser ist etwas schwer zu finden, aber wenn Sie sich die folgenden 2 Manpages ansehen, werden Sie die folgenden Hinweise sehen:
töten (1)$ man 1 kill
...
If sig is 0, then no signal is sent, but error checking is still performed.
...
töten (2)
$ man 2 kill
...
If sig is 0, then no signal is sent, but error checking is still performed;
this can be used to check for the existence of a process ID or process
group ID.
...
Das Signal 0 sendet also eigentlich nichts an die PID Ihres Prozesses, prüft jedoch, ob Sie dazu berechtigt sind.
Ein offensichtlicher Ort wäre, wenn Sie versuchen würden, festzustellen, ob Sie die Berechtigung haben, Signale über an einen laufenden Prozess zu senden kill
. Sie können überprüfen, bevor kill
Sie das gewünschte Signal senden , indem Sie einen Scheck einwickeln, um sicherzustellen, dass dies kill -0 <PID>
zuerst zulässig war.
Angenommen, ein Prozess wurde von root wie folgt ausgeführt:
$ sudo sleep 2500 &
[1] 15693
Wenn wir diesen Befehl jetzt in einem anderen Fenster ausführen, können wir bestätigen, dass diese PID ausgeführt wird.
$ pgrep sleep
15693
Versuchen wir nun diesen Befehl, um zu sehen, ob wir Zugriff haben, um diese PID-Signale über zu senden kill
.
$ if ! kill -0 $(pgrep sleep); then echo "You're weak!"; fi
bash: kill: (15693) - Operation not permitted
You're weak!
Es funktioniert also, aber die Ausgabe gibt eine Meldung aus dem kill
Befehl aus, dass wir keine Berechtigungen haben. Keine große Sache, fangen Sie einfach STDERR und senden Sie es an /dev/null
.
$ if ! kill -0 $(pgrep sleep) 2>/dev/null; then echo "You're weak!"; fi
You're weak!
Dann könnten wir so etwas machen killer.bash
:
#!/bin/bash
PID=$(pgrep sleep)
if ! kill -0 $PID 2>/dev/null; then
echo "you don't have permissions to kill PID:$PID"
exit 1
fi
kill -9 $PID
Jetzt, wenn ich das oben genannte als Nicht-Root-Benutzer ausführe:
$ ~/killer.bash
you don't have permissions to kill PID:15693
$ echo $?
1
Wenn es jedoch als root ausgeführt wird:
$ sudo ~/killer.bash
$ echo $?
0
$ pgrep sleep
$
pgrep
, ps
analysieren oder test -e /proc/$PID
in tragbaren Skripten verwenden, es kill -0
funktioniert jedoch überall. Wenn Sie eine PID erhalten, die möglicherweise veraltet ist, z. B. einen /var/run
Eintrag , können Sie auf einfache Weise überprüfen, ob der Prozess noch aktiv ist.
kill -0 $(pgrep sleep)
nicht unbedingt bedeuten, dass Sie schwach sind. Er gibt false zurück, wenn kein sleep
Befehl ausgeführt wird oder wenn mehr als einer ausgeführt wird und einer nicht getötet werden kann oder wenn einer der Schlafzustände zwischen dem pgrep und dem kill stirbt Befehle ausgeführt werden.
kill -0
(oder die tragbarere POSIX-Variante kill -s 0
) sendet zwar ein Signal, sendet jedoch keines. Es ist eine Funktion der zugrunde liegenden C-API , die der Shell-Befehl auf einfache Weise verfügbar macht.
kill -s 0 -- "$pid"
Somit wird geprüft, ob ein Prozess mit der angegebenen PID ausgeführt wird (oder ob PGID $pid
negativ ist) und ob der aktuelle Prozess die Berechtigung hat, ihm (bei einem negativen Prozess ein beliebiger Prozess in der Prozessgruppe $pid
) ein Signal zu senden. Dies ist meistens eine Möglichkeit zu testen, ob ein Prozess (oder eine Prozessgruppe) aktiv ist.
Beachten Sie, dass dies nicht unbedingt der erwartete Prozess ist, auch wenn ein Prozess mit der erwarteten PID und den erwarteten Berechtigungen ausgeführt wird. Es ist möglich, dass der Prozess, von dem Sie erwarten, dass er früher gestorben ist und seine PID für einen nicht verwandten Prozess wiederverwendet wurde. Die richtige Methode zum Überwachen von Prozessen besteht darin, das übergeordnete Element dazu zu überlassen. Die PID eines Prozesses wird erst dann wiederverwendet, wenn das übergeordnete Element den Tod bestätigt hat (daher gibt es Zombies ). Daher kann das übergeordnete Element eines Prozesses seine untergeordneten Elemente zuverlässig anhand ihrer PID identifizieren.
Das kill -0 $pid
teilt Ihnen mit, ob ein Prozess mit $pid
existiert.
Im Ausschnitt
if ! kill -0 $(cat /path/to/file.pid); then
... do something ...
fi
Der Block ... do something ...
wird ausgeführt, wenn ein Prozess mit der in gespeicherten PID ausgeführt /path/to/file.pid
wird - und - sofern das Snippet nicht als Root ausgeführt wird - wenn die PID unter demselben Benutzer ausgeführt wird.
Der POSIX-Standard legt die Rolle des 0
Signals fest:
Wenn sig 0 ist (das Nullsignal), wird eine Fehlerprüfung durchgeführt, es wird jedoch kein Signal gesendet. Das Nullsignal kann verwendet werden, um die Gültigkeit von pid zu überprüfen.
(kill (3p), POSIX.1-2008 - ähnlicher Wortlaut in POSIX.1-2001)
Beachten Sie, dass POSIX sowohl kill -0
als auch kill -s 0
Befehlszeilenstile angibt (kill (1p)).
Im Gegensatz zur kill syscall-Schnittstelle kann mit dem kill
Befehl nicht zuverlässig überprüft werden, ob PIDs anderer Benutzer (als normaler Benutzer) vorhanden sind, z.
$ kill -0 123
kill: kill 123 failed: no such process
$ echo $?
1
gegen
$ kill -0 1
kill: kill 1 failed: operation not permitted
$ echo $?
1
Beim Aufruf des kill syscall kann man diese Fälle anhand des errno
Wertes zuverlässig unterscheiden (vgl. ZB ein Python-Beispiel ).
trap
Befehl " Bash" und "0" und einem Signal "0" vonkill
: Was ist das Signal "0" in einem Trap-Befehl?