Réponses:
l'envoi du signal 0
à un donné PID
vérifie simplement si un processus avec le donné PID
est en cours d'exécution et vous avez la permission de lui envoyer un signal.
Pour plus d'informations, consultez les pages de manuel suivantes:
tuer (1)$ man 1 kill
...
If sig is 0, then no signal is sent, but error checking is still performed.
...
tuer (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
plutôt.
man 1 kill
et l' man 2 kill
avaient sur mon système Fedora 20. C'est difficile à repérer, enfoui dans ces deux pages de manuel.
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.
utilisez
man 2 kill
est en dehors du 1er amendement :)
... il peut être difficile de trouver de la documentation sur ce signal spécial. Malgré ce que d'autres ont dit, la seule mention de ce signal dans les man 1 kill
systèmes basés sur Debian est:
Les signaux particulièrement utiles incluent HUP, INT, KILL, STOP, CONT et 0.
Pas particulièrement utile, surtout si vous ne savez pas déjà ce que fait le signal. Il n'est pas non plus répertorié dans la sortie de kill -l
, donc vous ne le saurez pas à moins que vous ne le sachiez déjà.
Sur les systèmes Debian et Ubuntu, la sortie de man 2 kill
dit, en partie:
Si sig vaut 0, aucun signal n'est envoyé, mais la vérification des erreurs est toujours effectuée; cela peut être utilisé pour vérifier l'existence d'un ID de processus ou d'un ID de groupe de processus.
Vous pouvez utiliser kill -0
pour vérifier si un processus est en cours d'exécution. Considérez ces exemples.
# 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: $?"
Vous pouvez également utiliser kill -0
pour déterminer si l'utilisateur actuel dispose des autorisations nécessaires pour signaler un processus donné. Par exemple:
# 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)
Voici l'extrait de 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
page de manuel: "Si sig vaut 0, aucun signal n'est envoyé, mais la vérification des erreurs est toujours effectuée."
Cette commande vérifie si le processus avec PID dans $ pid est actif.
$pid
peut être en cours d'exécution mais vous n'avez pas l'autorisation de lui envoyer un signal.
kill(1)
imprimera une erreur différente pour chacun. Ainsi, vous pouvez dire si le pid est actif, que vous ayez ou non l'autorisation d'envoyer des signaux. De plus, l'utilisation typique de kill -0
est de voir si le pid est vivant, même s'il n'est pas toujours utilisé correctement. Je dirais que cette réponse est correcte (à part l'orthographe).
kill -0 $pid
sera la même dans les deux cas. Il retournera 1
donc vous ne pouvez pas dire sans analyser la sortie kill
si le processus est en cours d'exécution ou non, si vous n'avez pas l'autorisation de lui envoyer un signal. EDIT: oui je sais qu'il est utilisé la plupart du temps pour vérifier si un processus est en vie, mais c'est faux à moins que vous ne puissiez garantir que vous avez la permission d'envoyer le signal (par exemple: être root)
kill
bash intégré (la question est étiquetée bash
) renvoie le type d'erreur sur stderr, et l'indication d'une erreur dans son code retour. Autrement dit, "Cette commande vérifie [si] le processus avec PID dans $ pid est actif" est tout à fait correct si vous interprétez correctement la sortie. [Je n'aurais pas fait de commentaire si vous n'aviez pas dit que vous aviez donné -1 à la réponse. Votre commentaire est par ailleurs valide].
Kill -0 $ pid consiste à vérifier si le processus avec pid existe ou non.
Soyez prudent lorsque vous utilisez 'kill -0 $ pid' pour vérifier l'existence du processus car
Une fois le processus prévu terminé, son pid peut être attribué à un autre processus nouvellement créé. (On ne peut donc pas être si sûr que ce processus particulier est vivant ou non)
Dans le cas du processus Zombie, pour lequel l'enfant attend que le parent appelle, attendez. Ici, il contient le $ pid et donne le résultat positif pendant que le processus n'est pas en cours d'exécution.
Kill -0 $ pid utilisé pour vérifier si un processus exécuté avec $ pid est actif ou non. Mais cela peut être délicat, car l'ID de processus peut être réaffecté, une fois qu'un processus se termine et qu'un nouveau processus s'exécute. On peut utiliser killall -0 pour se renseigner sur un processus particulier en cours d'exécution ou non.
EXIT
signal ou 0
vers un processus:stdout
de succès.stderr
si quelque chose ne va pas.Plus explicitement, une fonction utile pour vos scripts shell serait:
function isProcess ()
{
kill -s EXIT $1 2> /dev/null
}
Cela ne renvoie aucun texte en cas stdout
de succès, mais un message d'erreur à stderr
en cas d'échec (mais j'ai redirigé ce message d'erreur vers/dev/null
).
Si vous êtes préoccupé par l'état du processus obsolète / zombie , vous devez utiliser ps
, de préférence avec le --no-headers
commutateur.
#!/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 $?
}