147 votes

Bash : comment vérifier si un id de processus (PID) existe

<p>Dans un script bash, je veux faire ce qui suit (en pseudo code) :<pre><code></code></pre><p>Quel est le bash approprié pour l’instruction conditionnelle ?</p><p>Merci</p></p>

214voto

FDS Points 583

La meilleure façon est:

if ps -p $PID > /dev/null
then
   echo "$PID is running"
   # Do something knowing the pid exists, i.e. the process with $PID is running
fi

Le problème avec:

kill -0 $PID

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:

kill -0 1

et

kill -0 $non-running-pid

avoir 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".

Le répertoire /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?

146voto

<p>Pour vérifier l’existence d’un processus, utilisez<pre><code></code></pre><p>Mais tout comme @unwind dit, si vous allez le tuer de toute façon, il suffit</p><pre><code></code></pre><p>ou vous aurez une condition de concurrence critique.</p><p>Si vous souhaitez ignorer la sortie de texte de <code></code> et faire quelque chose basé sur le code de sortie, vous pouvez</p><pre><code></code></pre></p>

54voto

user2683246 Points 101
<pre><code></code><p>ou</p><pre><code></code></pre><p><code></code>est un format de sortie pour afficher uniquement la colonne ID de processus avec aucun en-tête.</p></pre>

27voto

oherrala Points 390
<p><code></code>commande avec <code></code> pour cela :<pre><code></code></pre></p>

10voto

elcuco Points 3953

Vous avez deux façons:

Permet de commencer par la recherche d'une application spécifique dans mon ordinateur portable:

[root@pinky:~]# ps fax | grep mozilla
 3358 ?        S      0:00  \_ /bin/sh /usr/lib/firefox-3.5/run-mozilla.sh /usr/lib/firefox-3.5/firefox
16198 pts/2    S+     0:00              \_ grep mozilla

Tous les exemples maintenant va chercher PID 3358.

Première façon: 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:

[root@pinky:~]# ps aux | awk '{print $2 }' | grep 3358
3358

Ainsi, votre code sera:

if [ ps aux | awk '{print $2 }' | grep -q $PID 2> /dev/null ]; then
    kill $PID 
fi

Deuxième façon: il suffit de regarder pour quelque chose dans l' /proc/$PID répertoire. Je suis à l'aide de "exe" dans cet exemple, mais vous pouvez utiliser n'importe quoi d'autre.

[root@pinky:~]# ls -l /proc/3358/exe 
lrwxrwxrwx. 1 elcuco elcuco 0 2010-06-15 12:33 /proc/3358/exe -> /bin/bash

Ainsi, votre code sera:

if [ -f /proc/$PID/exe ]; then
    kill $PID 
fi

BTW: quoi de mal avec kill -9 $PID || true ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by: