GNU/Linux >> Tutoriels Linux >  >> Linux

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

Solution 1 :

en termes simples, non :un processus (par exemple un démon) peut planter 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 comme une socket. Ecrire le port socket dans un fichier et avoir le supervisor processus de recherche.

Vous pouvez également utiliser les services de DBus sous Linux :enregistrez un nom spécifique et demandez à votre processus de supervision (peu importe comment vous l'appelez) de vérifier ce nom.

Il existe de nombreuses techniques.

Une chose à retenir :ce n'est pas la responsabilité du système d'exploitation de gérer les fichiers PID.

Solution 2 :

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 quand j'ai besoin de savoir si un processus est en cours d'exécution. Je pourrais ensuite croiser la sortie avec le(s) fichier(s) .pid si je le jugeais nécessaire.

Solution 3 :

Un fichier contenant un identifiant de processus n'est pas fiable pour déterminer 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'identifiant du processus, vous devez vérifier davantage 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 commande intéressante, mais vous aurez des problèmes lorsque plusieurs instances seront en cours d'exécution. Par exemple, lorsque vous avez un sshd normal 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, alors 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 non recommande d'utiliser uniquement ps , passant par un ou plusieurs tuyaux avec grep et grep -v essayer 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 existe.

Solution 4 :

Il n'est pas fiable de simplement vérifier 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 meurt, le verrou disparaît. À condition 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.


Linux
  1. Changer l'environnement d'un processus en cours ?

  2. Le réglage dans Bash pour Globbing, pour contrôler si * correspond aux fichiers de points ?

  3. Vérifier le processus si le même est en cours d'exécution ?

  4. Pseudo fichiers pour données temporaires ?

  5. Quel processus a le Pid 0 ?

Comment puis-je créer un fichier de vidage d'un processus en cours d'exécution sous Linux ?

Pourquoi les fichiers .so sont-ils exécutables ?

Détermination du processeur particulier sur lequel un processus s'exécute

Que sont les signaux en attente ?

Déterminez dans quel(s) groupe(s) se trouve un processus en cours d'exécution ?

Variables d'environnement d'un processus en cours d'exécution sous Unix ?