Les fichiers .pid sont-ils fiables pour déterminer si un processus est en cours d'exécution?

11

De nombreux programmes tels que sshd créent des fichiers .pid dans / var / run / qui contiennent leur ID de processus. Ces fichiers sont-ils fiables pour déterminer si un processus est en cours d'exécution? Je suppose que ces fichiers sont créés manuellement par un processus et resteront donc toujours dans le système de fichiers si le programme plante.

indiv
la source

Réponses:

16

en termes simples, non : un processus (par exemple un démon) peut se bloquer et ne pas avoir le temps d'effacer son fichier .pid.

Une technique pour être plus sûr de l'état d'un programme: utiliser un canal de communication explicite tel qu'une socket. Écrivez le port de socket dans un fichier et demandez au supervisorprocessus de le rechercher.

Vous pouvez également utiliser les services de DBus sur Linux: enregistrez un nom spécifique et demandez à votre superviseur (quel que soit votre nom) de vérifier ce nom.

Il existe de nombreuses techniques.

Une chose à retenir: il n'est pas de la responsabilité de l'OS de gérer les fichiers PID.

jldupont
la source
1
L'existence du fichier pid, COMBINÉE avec l'existence du processus devrait cependant être suffisante. Si le processus s'arrête, vous pouvez le vérifier. Les PID sont réutilisés, mais pas très souvent.
MarkR
2
la fréquence de réutilisation d'un pid dépend du système particulier en question. J'ai vu un système où les PID étaient cyclés au moins quotidiennement. Vous devez vérifier le pid, qu'il existe un processus et que le processus semble être celui auquel vous vous attendez à posséder le pid.
@atk: exactement. Il n'y a pas de standard en soi et même s'il y en avait un, il peut très bien ne pas être respecté par certaines implémentations. Par exemple, je peux créer un démon qui n'écrit pas du tout de fichier PID et utiliser un canal arrière pour obtenir ses commandes de gestion.
jldupont
@atk: malheureusement, il n'y a aucun moyen de s'assurer que le PID ne soit pas réutilisé entre le moment de la vérification et le moment de l'utilisation ...
SamB
3

Jldupont a raison de dire que les fichiers .pid ne sont pas fiables pour déterminer si un processus est en cours d'exécution car le fichier ne peut pas être supprimé en cas de plantage.

Mis à part les conditions de concurrence , j'utilise souvent pgrep lorsque j'ai besoin de savoir si un processus est en cours d'exécution. Je pourrais alors croiser la sortie avec le ou les fichiers .pid si je le jugeais nécessaire.

jschmier
la source
3

Un fichier contenant un identifiant de processus n'est pas fiable. Déterminez si un processus est en cours d'exécution ou non. C'est juste une source fiable pour déterminer le dernier identifiant de processus donné pour le processus.

Lorsque vous avez l'ID de processus, vous devez vérifier plus avant, si le processus est réellement en cours d'exécution.

Voici un exemple:

#!/usr/bin/env sh

file="/var/run/sshd.pid"
processid=$(cat /var/run/sshd.pid)

if [ ! -f ${file} ]; then
    echo "File does not exists: ${file}"
    exit 1
fi

if [ ! -r ${file} ]; then
    echo "Insufficient file persmissons: ${file}"
    exit 1
fi

psoutput=$(ps -p ${processid} -o comm=)

if [ $? == 0 ];then
    if [ ${psoutput} == "sshd" ]; then
        echo "sshd process is realy running with process id ${processid}"
        exit 0
    else
        echo "given process id ${processid} is not sshd: ${psoutput}"
        exit 1
    fi
else
    echo "there is no process runing with process id ${processid}"
    exit 0
fi

pgrep est une belle commande, mais vous aurez des ennuis lorsque vous aurez plusieurs instances en cours d'exécution. Par exemple, lorsque vous avez un sshd standard en cours d'exécution sur le port TCP / 22 et que vous avez un autre sshd en cours d'exécution sur le port TCP / 2222, pgrep fournira deux identifiants de processus lors de la recherche de sshd ... lorsque le sshd normal a son pid dans / var /run/sshd.pid et l'autre pourrait avoir son pid dans /var/run/sshd-other.pid vous pouvez clairement différencier les processus.

Je ne recommande pas d' utiliser uniquement ps , de passer par un ou plusieurs tuyaux avec grep et grep -v en essayant de filtrer toutes les autres choses qui ne vous intéressent pas ... c'est un peu comme utiliser

find . | grep myfile

pour savoir si un fichier se termine.

Mirko Steiner
la source
2

Il n'est pas fiable de vérifier simplement l'existence d'un processus avec le même pid que celui contenu dans le fichier.

Mais de nombreuses implémentations de pidfile verrouillent également le pidfile, de sorte que si le processus se termine, le verrou disparaît. Pourvu que le mécanisme de verrouillage soit fiable, vérifier si le fichier est toujours verrouillé est un mécanisme relativement fiable pour déterminer si le processus d'origine est toujours en cours d'exécution.

Paul Brannan
la source
1

Jldupont a raison.

Vous pouvez cependant envoyer au processus un signal 0 (kill -s 0 pid) pour voir si le processus est toujours en vie (en supposant que vous avez le pouvoir d'envoyer un tel signal - en général, seul le propriétaire d'un processus peut envoyer c'est un signal).


la source
4
Mais vérifier l'existence d'un processus avec ce PID ne signifie pas que c'est le PID qui vous intéresse.
Janm
0

Je suis d'accord avec jschmier.

Sur certains systèmes, vous n'avez pas accès à pgrep. Dans un tel cas, vous pouvez faire ps -aef | grep <pid>pour savoir si le processus est réellement en cours d'exécution.

user29584
la source
1
Le point clé de la question était "fiable". Faire un ps et chercher un PID n'est pas fiable.
Janm
eh bien ... en supposant que vous connaissez le nom du programme, pourquoi pensez-vous que ps -aef | grep n'est pas fiable?
user29584
3
Conditions de course: l'état du système a changé à la fin de ps. Titres de processus: un autre processus pourrait avoir un titre similaire à celui qui vous intéresse. Plusieurs instances: considérez un système avec deux instances du même service, chacune avec un fichier PID. L'un échoue et l'autre redémarre et obtient le PID du premier service. Comment le dites-vous? Etc. Pas fiable, impossible de bien faire à cause des conditions de course, et il existe des techniques fiables qui fonctionnent. Pour une alternative fiable, voir, par exemple, cr.yp.to/daemontools.html
janm