web-dev-qa-db-fra.com

Que fait `kill -0`?

J'ai récemment rencontré cela dans un script Shell.

if ! kill -0 $(cat /path/to/file.pid); then
    ... do something ...
fi

Qu'est-ce que kill -0 ... faire?

69
slm

kill -0 (ou sa variante POSIX plus portable kill -s 0) passe par le mouvement d'envoi d'un signal, mais n'en envoie pas réellement un. C'est une fonctionnalité de API C sous-jacente que commande Shell expose de manière simple.

kill -s 0 -- "$pid" teste donc s'il y a un processus en cours avec le PID donné (ou PGID si $pid est négatif), et si le processus en cours aurait l'autorisation de l'envoyer (n'importe lequel des processus du groupe de processus en cas de négatif $pid) un signal. C'est surtout un moyen de tester si un processus (ou un groupe de processus) est vivant.

Gardez à l'esprit que même s'il existe un processus en cours d'exécution avec le PID et les autorisations attendus, ce n'est pas nécessairement le processus que vous attendez. Il est possible que le processus que vous attendez soit mort plus tôt et que son PID ait été réutilisé pour un processus indépendant. La bonne façon de surveiller les processus est de laisser leur parent le faire - le PID d'un processus n'est pas réutilisé tant que son parent n'a pas reconnu sa mort (c'est pourquoi zombies existent), afin que le parent d'un processus puisse identifier de manière fiable ses enfants par leur PID.

Le kill -0 $pid vous indique si un processus avec $pid existe.

Dans l'extrait

if ! kill -0 $(cat /path/to/file.pid); then
    ... do something ...
fi

le bloc ... do something ... est exécuté si un processus avec le PID stocké dans /path/to/file.pid est en cours d'exécution - et - à moins que l'extrait ne s'exécute en tant que root - si le PID s'exécute sous le même utilisateur.

La norme POSIX spécifie le rôle du 0 signal:

Si sig vaut 0 (le signal nul), une vérification d'erreur est effectuée mais aucun signal n'est réellement envoyé. Le signal nul peut être utilisé pour vérifier la validité de pid.

( kill (3p) , POSIX.1-2008 - libellé similaire dans POSIX.1-2001)

Notez que POSIX spécifie à la fois kill -0 et kill -s 0 styles de ligne de commande ( kill (1p) ).

Contrairement à l'interface kill syscall, la commande kill ne peut pas être utilisée pour vérifier de manière fiable l'existence de PID appartenant à d'autres utilisateurs (en tant qu'utilisateur normal), par exemple:

$ kill -0 123
kill: kill 123 failed: no such process
$ echo $?
1

vs.

$ kill -0 1
kill: kill 1 failed: operation not permitted
$ echo $?
1

Lors de l'appel du kill syscall, on peut distinguer de manière fiable ces cas en regardant la valeur errno (cf. par exemple un Exemple Python ).

2
maxschlepzig