150 votes

Que fait `kill -0 $pid` dans un shell script ?

En fait, quel signal représente "0", parce que aquí Je vois des numéros de SIGNAUX commençant par 1.

3 votes

3 votes

Voir également le Variante Unix.SE de cette question qui diffère de kill 0 (sans tiret), a expliqué aquí y aquí .

145voto

dwalter Points 2428

Envoyer le signal 0 à un PID vérifie simplement si un processus avec l'adresse PID est en cours d'exécution et que 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.
...

7 votes

L'emplacement de cette information (si elle existe) dépend fortement du système. Sur les systèmes récents basés sur Debian, utilisez man 2 kill au lieu de cela.

2 votes

Les deux man 1 kill y man 2 kill l'avait sur mon système Fedora 20. Il est cependant difficile à repérer, enfoui dans ces deux pages de manuel.

0 votes

Vous pouvez aussi vous référer au manuel posix : 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/fonctions/kill.html

133voto

CodeGnome Points 25402

C'est une bonne question parce que...

...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 en man 1 kill dans les systèmes basés sur Debian est :

Les signaux particulièrement utiles sont 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é par la sortie de kill -l Vous ne le saurez donc que si vous le savez déjà.

Où trouver la documentation

Sur les systèmes Debian et Ubuntu, la sortie de la commande man 2 kill dit, en partie :

Si sig vaut 0, alors 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.

À quoi ça sert ?

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 a les permissions de 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: $?"

0 votes

Sur mac et BSD, il est également documenté dans kill(2) Voici l'extrait : 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.

8 votes

Cela devrait être la réponse acceptée. Bien meilleure que l'autre. La documentation sur le signal 0 est difficile à trouver. Elle est enterrée dans le kill page de manuel : "Si sig est égal à 0, alors aucun signal n'est envoyé, mais la vérification des erreurs est toujours effectuée."

10voto

Sandeep_black Points 647

kill -0 $pid est de vérifier si le processus avec l'id de processus (pid) existe ou non.

Soyez prudent lorsque vous utilisez kill -0 $pid pour vérifier l'existence du processus car

  1. Une fois que le processus prévu se termine, son pid peut être attribué à un autre processus nouvellement créé. (On ne peut donc pas être sûr qu'un processus particulier est vivant ou non).

  2. Dans le cas d'un processus zombie, pour lequel l'enfant attend que le parent appelle wait. Ici, il retient le $pid et donne le résultat positif alors que le processus n'est pas en cours d'exécution.

6voto

fgm Points 5930

Cette commande vérifie si le processus dont le PID est $pid est vivant.

1 votes

La page de manuel dit : "Si sig est égal à 0, alors aucun signal n'est envoyé, mais le contrôle d'erreur est toujours effectué." De quel contrôle d'erreur s'agit-il ici ?

2 votes

-1, puisqu'un processus avec PID $pid peut être en cours d'exécution mais vous n'avez pas la permission de lui envoyer un signal.

3 votes

@dwalter : Si vous n'avez pas d'autorisation, vous obtiendrez un EPERM. Si elle n'existe pas, vous obtiendrez un ESRCH. Le site kill(1) imprimera une erreur différente pour chacun. Ainsi, vous pouvez savoir si le pid est vivant, que vous ayez ou non les permissions 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).

1voto

kill -0 $pid est utilisé pour vérifier si un processus fonctionnant avec $pid est vivant ou non. Mais cela peut être délicat, car l'ID du processus peut être réaffecté, une fois qu'un processus se termine et qu'un nouveau processus est lancé.

On peut utiliser killall -0 <process name> pour savoir si un processus particulier est en cours d'exécution ou non.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X