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 /procsystè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 pslui-même obtient ses informations de /proctoute 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/PIDrépertoire ou où un /proc/PIDré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 psau lieu de vérifier l'existence du répertoire?
kill -0c'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.
killfonction 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).