Antworten:
Wenn Sie das Signal 0
an eine bestimmte PID
Person senden , wird nur überprüft, ob ein Prozess mit der angegebenen Funktion ausgeführt PID
wird, und Sie haben die Berechtigung, ein Signal an diese zu senden.
Weitere Informationen finden Sie auf den folgenden Seiten:
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.
...
man 2 kill
stattdessen.
man 1 kill
und man 2 kill
hatte es auf meinem Fedora 20 System. Es ist jedoch schwer zu erkennen, in diesen beiden Manpages vergraben.
If sig is 0 (the null signal), error checking is performed but no signal is actually sent. The null signal can be used to check the validity of pid.
pubs.opengroup.org/onlinepubs/009695399/functions/kill.html
man 2 kill
ist außerhalb der 1. Änderung :)
... kann es schwierig sein, Dokumentation zu diesem speziellen Signal zu finden. Ungeachtet dessen, was andere gesagt haben, ist die einzige Erwähnung dieses Signals man 1 kill
in Debian-basierten Systemen:
Besonders nützliche Signale sind HUP, INT, KILL, STOP, CONT und 0.
Nicht besonders hilfreich, besonders wenn Sie noch nicht wissen, was das Signal bewirkt. Es wird auch nicht in der Ausgabe von aufgeführt kill -l
, sodass Sie nichts davon wissen, es sei denn, Sie wissen es bereits.
Auf Debian- und Ubuntu-Systemen ist die Ausgabe von man 2 kill
Teil:
Wenn sig 0 ist, wird kein Signal gesendet, aber die Fehlerprüfung wird trotzdem durchgeführt. Dies kann verwendet werden, um das Vorhandensein einer Prozess-ID oder einer Prozessgruppen-ID zu überprüfen.
Mit können Sie kill -0
überprüfen, ob ein Prozess ausgeführt wird. Betrachten Sie diese Beispiele.
# Kill the process if it exists and accepts signals from
# the current user.
sleep 60 &
pid=$!
kill -0 $pid && kill $pid
# Check if a PID exists. When missing, this should result
# in output similar to:
# bash: kill: (6228) - No such process
# Exit status: 1
kill -0 $pid; echo "Exit status: $?"
Sie können auch kill -0
bestimmen, ob der aktuelle Benutzer über Berechtigungen zum Signalisieren eines bestimmten Prozesses verfügt. Beispielsweise:
# See if you have permission to signal the process. If not,
# this should result in output similar to:
# bash: kill: (15764) - Operation not permitted
# Exit status: 1
sudo sleep 60 &
kill -0 $!; echo "Exit status: $?"
kill(2)
Hier ist der Ausschnitt:The kill() function sends the signal specified by sig to pid, a process or a group of processes. Typically, Sig will be one of the signals specified in sigaction(2). A value of 0, however, will cause error checking to be performed (with no signal being sent). This can be used to check the validity of pid.
kill
Manpage vergraben : "Wenn sig 0 ist, wird kein Signal gesendet, aber es wird immer noch eine Fehlerprüfung durchgeführt."
Dieser Befehl prüft, ob der Prozess mit der PID in $ pid aktiv ist.
$pid
möglicherweise ein Prozess mit PID ausgeführt wird, Sie jedoch nicht die Berechtigung haben, ein Signal an ihn zu senden.
kill(1)
gibt für jeden einen anderen Fehler aus. Sie können also feststellen, ob die PID aktiv ist, unabhängig davon, ob Sie zum Senden von Signalen berechtigt sind oder nicht. Darüber hinaus besteht die typische Verwendung von kill -0
darin, festzustellen, ob die PID aktiv ist, auch wenn sie nicht immer korrekt verwendet wird. Ich würde sagen, diese Antwort ist richtig (abgesehen von der Schreibweise).
kill -0 $pid
ist in beiden Fällen gleich. Es wird zurückgegeben, 1
sodass Sie nicht ohne Analyse der Ausgabe sagen können, kill
ob der Prozess ausgeführt wird oder nicht, wenn Sie nicht die Berechtigung haben, ein Signal an ihn zu senden. BEARBEITEN: Ja, ich weiß, dass es die meiste Zeit verwendet wird, um zu überprüfen, ob ein Prozess aktiv ist, aber dies ist falsch, es sei denn, Sie können garantieren, dass Sie die Berechtigung zum Senden des Signals haben (z. B. root sein)
kill
eingebaute Bash (die Frage ist markiert bash
) die Art des Fehlers auf stderr und die Anzeige ausgibt eines Fehlers in seinem Rückkehrcode. Das heißt, "Dieser Befehl prüft, ob der Prozess mit der PID in $ pid aktiv ist" ist vollständig korrekt, wenn Sie die Ausgabe richtig interpretieren. [Ich hätte nicht kommentiert, wenn Sie nicht gesagt hätten, dass Sie der Antwort -1 gegeben haben. Ihr Kommentar ist ansonsten gültig].
Kill -0 $ pid dient dazu zu überprüfen, ob der Prozess mit pid vorhanden ist oder nicht.
Seien Sie vorsichtig, wenn Sie 'kill -0 $ pid' verwenden, um die Existenz des Prozesses zu überprüfen, da
Sobald der beabsichtigte Prozess beendet ist, kann seine PID einem anderen neu erstellten Prozess zugewiesen werden. (Man kann also nicht so sicher sein, ob ein bestimmter Prozess aktiv ist oder nicht)
Im Falle eines Zombie-Prozesses wartet das Kind darauf, dass die Eltern auf wait warten. Hier hält es die $ pid und gibt das positive Ergebnis, während dieser Prozess nicht läuft.
Kill -0 $ pid wird verwendet, um zu überprüfen, ob ein mit $ pid ausgeführter Prozess aktiv ist oder nicht. Dies kann jedoch schwierig sein, da die Prozess-ID neu zugewiesen werden kann, sobald ein Prozess beendet wird und ein neuer Prozess ausgeführt wird. Man kann killall -0 verwenden, um herauszufinden, ob ein bestimmter Prozess ausgeführt wird oder nicht.
EXIT
Signals oder 0
an einen Prozess wird:stdout
Bei Erfolg wird keine Ausgabe an gesendet.stderr
wenn etwas nicht stimmt.Genauer gesagt wäre eine nützliche Funktion für Ihre Shell-Skripte:
function isProcess ()
{
kill -s EXIT $1 2> /dev/null
}
Dies gibt stdout
bei Erfolg keinen Text zurück , sondern eine Fehlermeldung stderr
bei Fehler (aber ich habe diese Fehlermeldung an weitergeleitet /dev/null
).
Wenn Sie sich Sorgen über den Status eines nicht mehr existierenden / Zombie-Prozesses machen , müssen Sie diesen verwenden ps
, vorzugsweise mit dem --no-headers
Schalter.
#!/bin/ksh
function trim ()
{
echo -n "$1" | tr -d [:space:]
}
function getProcessStatus ()
{
trim $(ps -p $1 -o stat --no-headers)
}
function isZombie ()
{
typeset processStatus=$(getProcessStatus $1)
[[ "$processStatus" == "Z" ]]
return $?
}