Comment vérifier si un id de processus (PID) existe
Dans un script bash, je veux faire la chose suivante (en pseudo-code):
if [ a process exists with $PID ]; then
kill $PID
fi
Ce qui est l'expression appropriée pour l'instruction conditionnelle?
Vous devez vous connecter pour publier un commentaire.
Pour vérifier l'existence d'un processus, utilisez
Mais tout comme @détendez-vous dit, si vous allez le tuer de toute façon, juste
ou vous aurez une condition de course.
Si vous souhaitez ignorer le texte de sortie de
kill
et faire quelque chose de basé sur le code de sortie, vous pouvezkill
est un peu mal nommée, en ce qu'elle n'est pas nécessairement tuer le processus. Il envoie le processus d'un signal.kill $PID
est équivalent àkill -15 $PID
, qui envoie le signal 15, SIGTERM au processus, ce qui est une instruction de mettre fin. Il n'y a pas un signal de 0, c'est une valeur particulière de raconterkill
de simplement vérifier si un signal peut être envoyé dans le processus, ce qui est pour la plupart des fins plus ou moins équivalent à vérifier s'il existe. Voir linux.die.net/man/2/kill et linux.die.net/man/7/signalkill -0
, j'ai, en fait, ont pour ce faire:kill -0 25667 ; echo $?
- et puis, si je reçois un0
retournés, les processus avec qui PID peut être tué; et si le processus de PID (dire) n'existe pas, le$?
sera1
, indiquant un échec. Est-ce exact?La meilleure façon est:
Le problème avec:
est le code de sortie sera non nulle même si le pid est en cours d'exécution et vous n'avez pas la permission de le tuer. Par exemple:
et
ont une indiscernables (non-nulle) code de sortie pour un utilisateur normal, mais le processus init (PID 1) est certainement en cours d'exécution.
DISCUSSION
Les réponses à discuter de tuer et de conditions de course sont exactement si le corps de l'essai est de "tuer". Je suis venu à la recherche pour le général "comment faites-vous tester pour un PID existence dans bash".
/Proc méthode est intéressante, mais dans un certain sens, les sauts de l'esprit de la "ps" de la commande de l'abstraction, c'est à dire que vous n'avez pas besoin d'aller chercher dans /proc parce que si Linus décide d'appeler le "exe" quelque chose d'autre?
-p
est inutile, au moins dans ce cas.ps $PID
a exactement le même résultat.ou
Dans cette dernière forme,
-o pid=
est un format de sortie pour l'affichage de l'ID de processus colonne sans en-tête. Les citations sont nécessaire de chaîne non vide opérateur-n
donner de résultat valable.if ps -p"$PID" -o "pid=" >/dev/null 2>&1; then echo "Process is running..."; fi
ps
les options et les fonctionnalités ont tendance à varier entre les plates-formes, donc c'est pas encore tout à fait portable.$PID
est vide alors[ -e /proc/$PID ]
retournera toujours le cas, puisque le/proc/
répertoire existe encore.ps
de commande avec-p $PID
pouvez faire ceci:Vous avez deux façons:
Permet de commencer par la recherche d'une application spécifique dans mon ordinateur portable:
Tous les exemples maintenant va chercher PID 3358.
Première: Run "ps aux" et grep pour le PID dans la deuxième colonne. Dans cet exemple, je regarde pour firefox, et puis pour qu'il PID:
De sorte que votre code sera:
Deuxième façon: il suffit de regarder pour quelque chose dans la
/proc/$PID
répertoire. Je suis à l'aide de "exe" dans cet exemple, mais vous pouvez utiliser n'importe quoi d'autre.De sorte que votre code sera:
BTW: quoi de mal avec
kill -9 $PID || true
?EDIT:
Après y avoir réfléchi pendant quelques mois.. (sur 24...) l'idée originale que j'ai donné ici est un hack sympa, mais très portables. Alors qu'il enseigne quelques détails de mise en œuvre de Linux, il ne pourra pas fonctionner sur Mac, Solaris ou *BSD. Il peut même échouer sur les futurs noyaux Linux. Veuillez utiliser "ps" comme décrit dans d'autres réponses.
/proc/$PID/exe
n'est pas un fichier régulier. Donc,[ -f /proc/$PID/exe ]
sera renvoie toujours unefalse
résultat. Essayez[ -h /proc/$PID/exe ]
.Je pense que c'est une mauvaise solution, qui s'ouvre pour les conditions de course. Que faire si le processus meurt entre votre essai et votre appel à tuer? Puis de tuer sera un échec. Alors pourquoi ne pas simplement essayer de le tuer dans tous les cas, et vérifier sa valeur de retour pour savoir comment ça s'est passé?
kill -9
. Que juste tue instantanément le processus en lui donnant aucune chance à nettoyer après lui-même. Au lieu d'utiliserkill
qui est équivalent àkill -15
. Si cela ne fonctionne pas, vous devez savoir pourquoi, et qu'en dernier recours, l'utilisationkill -9
.Il semble que vous voulez
qui sera de retour lors de la
$pid
finitions.Sinon, vous pouvez utiliser
pour vérifier si le processus est toujours en vie (ce qui est plus efficace que
kill -0 $pid
car il fonctionne même si vous n'avez pas le pid).pid 123 is not a child of this shell
code ci-dessous vérifie si mon processus est en cours, si oui, ne rien faire.
nous allons vérifier les nouveaux messages à partir d'Amazon SQS chaque heure si, et seulement si le processus n'est pas en cours d'exécution.
ici je stocker le PID dans un fichier appelé .pid (qui est une sorte de /exécuter/...) et seulement exécuter le script si ce n'est déjà en cours d'exécution.
remarque: il y a une race condition qu'il ne vérifie pas comment ce pid est appelé. si le système est redémarré et .pid existe mais il est utilisé par une autre application, cela pourrait mener une "conséquences imprévues'.
Par exemple dans GNU/Linux, vous pouvez utiliser:
Ou quelque chose comme
et qui vous indique le nom de l'application, il suffit de le nom, sans IDENTITÉ.
pidof
ne renvoie pas à un nombre négatif, que négatif PID n'a aucun sens, et vous ne pouvez pas tuerinit
, de sorte que votre conditionnelle n'a pas de sens (et d'ailleurs, vous auriez besoin pour échapper à la>
pour empêcher d'effectuer une redirection). Vous voulez vérifier un résultat vide, mais bien sûr, comme tout bon outil,pidof
définit un code de sortie pour vous dire si ça a marché, donc la solution appropriée estif Pid=$(pidof 'process_name'); then ...
ou (si vous n'avez pas besoin de valeur dansPid
plus tard), il suffit deif pidof 'process_name'; then...
pidof
exemple est pleine de malentendus au sujet de la façon dont bashtest
œuvres. gnu.org/software/bash/manual/html_node/...