J'écris un script Perl qui analyse les fichiers journaux pour collecter les PID, puis vérifie si ce PID est en cours d'exécution. J'essaie de penser à la meilleure façon de faire ce chèque. Évidemment, je pourrais faire quelque chose comme:
system("ps $pid > /dev/null") && print "Not running\n";
Cependant, je préfère éviter l'appel système si possible. J'ai donc pensé pouvoir utiliser le /proc
système de fichiers (la portabilité n'est pas un problème, cela fonctionnera toujours sur un système Linux). Par exemple:
if(! -d "/proc/$pid"){
print "Not running\n";
}
Est-ce sûr? Puis-je toujours supposer que s'il n'y a pas de /proc/$pid/
répertoire, le PID associé ne fonctionne pas? Je m'attends à ce que puisque l'AFAIK ps
lui-même obtient ses informations de /proc
toute façon, mais comme il s'agit du code de production, je veux en être sûr.
Ainsi, peut-il y avoir des cas où un processus en cours d'exécution n'a pas de /proc/PID
répertoire ou où un /proc/PID
répertoire existe et le processus n'est pas en cours d'exécution? Y a-t-il une raison de préférer l'analyse ps
au lieu de vérifier l'existence du répertoire?
kill -0
c'est la meilleure), cela vous indique uniquement s'il existe un processus en cours avec le PID donné . Il ne vous dit pas si le processus sera toujours en cours d'exécution une milliseconde plus tard, et il ne vous indique pas si le processus est celui qui vous intéresse ou un processus indépendant qui a reçu le même PID après la mort du processus intéressant . C'est presque toujours une erreur de tester si un PID donné fonctionne : il y a très peu de circonstances où cela n'est pas sujet aux conditions de course.
kill
fonction perl utilisant le signal 0 qui ne tue pas mais dit si vous pouvez le faire (c'est-à-dire que vous avez besoin d'une autorisation pour signaler ce processus).