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.