Bien que pidof
et pgrep
soient d'excellents outils pour déterminer ce qui fonctionne, ils ne sont malheureusement pas disponibles sur certains systèmes d'exploitation. Une sécurité intégrée définitive serait d'utiliser ce qui suit:ps cax | grep command
La sortie sur Gentoo Linux:
14484? S 0:00 apache2
14667? S 0:00 apache2
19620? Sl 0:00 apache2
21132? Ss 0:04 apache2
La sortie sur OS X:
42582 ?? Z 0: 00.00 (smbclient)
46529 ?? Z 0: 00.00 (smbclient)
46539 ?? Z 0: 00.00 (smbclient)
46547 ?? Z 0: 00.00 (smbclient)
46586 ?? Z 0: 00.00 (smbclient)
46594 ?? Z 0: 00.00 (smbclient)
Sur Linux et OS X, grep renvoie un code de sortie, il est donc facile de vérifier si le processus a été trouvé ou non:
#!/bin/bash
ps cax | grep httpd > /dev/null
if [ $? -eq 0 ]; then
echo "Process is running."
else
echo "Process is not running."
fi
De plus, si vous souhaitez la liste des PID, vous pouvez facilement grep pour ceux-ci également:
ps cax | grep httpd | grep -o '^ [] * [0-9] *'
Dont la sortie est la même sous Linux et OS X:
3519 3521 3523 3524
La sortie de ce qui suit est une chaîne vide, ce qui rend cette approche sûre pour les processus qui ne sont pas en cours d'exécution:
écho ps cax | grep aasdfasdf | grep -o '^[ ]*[0-9]*'
Cette approche convient pour écrire un simple test de chaîne vide, puis même pour parcourir les PID découverts.
#!/bin/bash
PROCESS=$1
PIDS=`ps cax | grep $PROCESS | grep -o '^[ ]*[0-9]*'`
if [ -z "$PIDS" ]; then
echo "Process not running." 1>&2
exit 1
else
for PID in $PIDS; do
echo $PID
done
fi
Vous pouvez le tester en l'enregistrant dans un fichier (nommé "running") avec des droits d'exécution (chmod + x running) et en l'exécutant avec un paramètre: ./running "httpd"
#!/bin/bash
ps cax | grep httpd
if [ $? -eq 0 ]; then
echo "Process is running."
else
echo "Process is not running."
fi
AVERTISSEMENT!!!
Veuillez garder à l'esprit que vous analysez simplement la sortie, ps ax
ce qui signifie que, comme on le voit dans la sortie Linux, il ne s'agit pas simplement d'une correspondance sur les processus, mais aussi sur les arguments passés à ce programme. Je recommande fortement d'être aussi précis que possible lors de l'utilisation de cette méthode (par exemple ./running "mysql"
, correspondra également aux processus «mysqld»). Je recommande fortement d'utiliser which
pour vérifier par rapport à un chemin complet lorsque cela est possible.
Références:
http://linux.about.com/od/commands/l/blcmdl1_ps.htm
http://linux.about.com/od/commands/l/blcmdl1_grep.htm
grep
se trouvera également en cours d'exécution (par exempleps cax | grep randomname
, retournera toujours 0 parce quegrep
trouvegrep randomname
(j'espère que c'est clair ...). Une solution consiste à ajouter des crochets autour de la première lettre du nom du processus, par exempleps cax | grep [r]andomname
.ps cax | rev | cut -f1 -d' ' | rev
affichera uniquement la colonne de nom, pour une analyse plus facile.ps cax
ne peut pas afficher entièrement le nom de la commande. Par exemple, il imprime "chrome-parcourir" au lieu de "chrome-browser".Vous DEVRIEZ connaître le PID!
Trouver un processus en essayant de faire une sorte de reconnaissance de formes sur les arguments du processus (comme
pgrep "mysqld"
) est une stratégie vouée à l'échec tôt ou tard. Et si vous avez deux mysqld en cours d'exécution? Oubliez cette approche. Vous pouvez faire les choses temporairement et cela peut fonctionner pendant un an ou deux, mais il se passe alors quelque chose auquel vous n'avez pas pensé.Seul l'identifiant de processus (pid) est vraiment unique.
Stockez toujours le pid lorsque vous lancez quelque chose en arrière-plan. Dans Bash, cela peut être fait avec la
$!
variable Bash. Vous vous épargnerez tellement de problèmes en le faisant.Comment déterminer si le processus est en cours d'exécution (par pid)
Alors maintenant, la question est de savoir comment savoir si un pid est en cours d'exécution.
Faites simplement:
C'est POSIX et donc portable. Il renverra le pid lui-même si le processus est en cours d'exécution ou ne retournera rien si le processus n'est pas en cours d'exécution. À proprement parler, la commande renverra une seule colonne, le
pid
, mais puisque nous avons donné qu'un en-tête de titre vide (le truc précédant immédiatement le signe égal) et que c'est la seule colonne demandée, la commande ps n'utilisera pas du tout l'en-tête. C'est ce que nous voulons car cela facilite l'analyse.Cela fonctionnera sous Linux, BSD, Solaris, etc.
Une autre stratégie consisterait à tester la valeur de sortie de la
ps
commande ci-dessus . Il doit être nul si le processus est en cours d'exécution et différent de zéro si ce n'est pas le cas. La spécification POSIX dit queps
doit quitter> 0 si une erreur s'est produite, mais je ne sais pas ce qui constitue «une erreur». Par conséquent, je n'utilise pas personnellement cette stratégie bien que je sois presque sûr qu'elle fonctionnera également sur toutes les plates-formes Unix / Linux.la source
grep <sometext>
recherche d'un processus donné, vous avez fait quelque chose de mal lorsque vous avez commencé le processus, à mon humble avis. Je déduis de la question du PO qu'effectivement il a le contrôle sur la façon dont le processus est lancé.Sur la plupart des distributions Linux, vous pouvez utiliser
pidof
(8).Il imprimera les ID de processus de toutes les instances en cours d'exécution des processus spécifiés, ou rien si aucune instance n'est en cours d'exécution.
Par exemple, sur mon système (j'ai quatre instances de
bash
et une instance deremmina
fonctionnement):Sur d'autres Unices,
pgrep
ou une combinaison deps
etgrep
réalisera la même chose, comme d'autres l'ont souligné à juste titre.la source
pidof httpd
fonctionne bien sur Red Hat 5. Mais sur mon Red Hat 4,pidof
n'est pas présent :-(Cela devrait fonctionner sur la plupart des versions d'Unix, BSD et Linux:
Testé sur:
PATH=...
]la source
ps
. Pour éviter la secondegrep
je suggère:ps aux | grep [h]ttpd
grep
.Le moyen le plus simple est d'utiliser ps et grep:
Si votre commande a des arguments de commande, vous pouvez également mettre plus de «grep cmd_arg1» après «grep $ command» pour filtrer les autres processus possibles qui ne vous intéressent pas.
Exemple: montrez-moi si un processus java avec l'argument fourni:
-Djava.util.logging.config.file = logging.properties
est en cours d'exécution
la source
ps cax
élimine le besoin d'utilisergrep -v
. Ainsi , par exemple, vous pouvez utiliser:ps cax | grep java > /dev/null || echo "Java not running"
.Juste un ajout mineur: si vous ajoutez le
-c
drapeau à ps, vous n'avez pas besoin de supprimer la ligne contenant le processus grep avecgrep -v
par la suite. C'est à direest tout ce dont vous aurez besoin sur un système bsd-ish (cela inclut MacOSX) Vous pouvez laisser le
-u
côté si vous avez besoin de moins d'informations.Sur un système où la génétique de la
ps
commande native renvoie à SysV, vous utiliseriezou
pour une liste contenant plus que le pid et le nom du processus. Bien sûr, vous pouvez sélectionner les champs spécifiques à imprimer en utilisant l'
-o <field,field,...>
option.la source
En rassemblant les différentes suggestions, la version la plus propre que j'ai pu proposer (sans grep peu fiable qui déclenche des parties de mots) est:
kill -0 ne tue pas le processus mais vérifie s'il existe et renvoie ensuite true, si vous n'avez pas de pidof sur votre système, stockez le pid lorsque vous lancez le processus:
puis dans le script:
la source
J'utilise
pgrep -l httpd
mais je ne suis pas sûr qu'il soit présent sur n'importe quelle plateforme ...Qui peut confirmer sur OSX?
la source
pidof
s'il vous plaît? OK tu as fait. Je vous remercie. Nous devrions donc trouver quelque chose d'autre fonctionnant sous OSX ... Votre base estps|grep
peut-être la solution unique ;-)Vous devez connaître le PID de votre processus.
Lorsque vous le lancez, son PID sera enregistré dans la
$!
variable. Enregistrez ce PID dans un fichier.Ensuite, vous devrez vérifier si ce PID correspond à un processus en cours. Voici un script squelette complet:
Basé sur la réponse de
peterh
. L'astuce pour savoir si un PID donné est en cours d'exécution est dans l'ps -o pid= -p $PID
instruction.la source
Cette approche peut être utilisée dans le cas où les commandes «ps», «pidof» et rest ne sont pas disponibles. J'utilise personnellement procfs très fréquemment dans mes outils / scripts / programmes.
Petite explication de ce qui se passe:
la source
Ceci imprime le nombre de processus dont le nom de base est "chrome-browser":
Si cela imprime "0", le processus n'est pas en cours d'exécution. La commande suppose que le chemin du processus ne contient pas d'espace de rupture. Je n'ai pas testé cela avec des processus suspendus ou des processus zombie.
Testé en utilisant
gwak
commeawk
alternative sous Linux.Voici une solution plus polyvalente avec quelques exemples d'utilisation:
la source
Voici ma version. Fonctionnalités:
scénario:
la source
Aucune des réponses n'a fonctionné pour moi, alors voici la mienne:
Explication:
Cela supprime le retour chariot créé par le terminal. Le reste peut être expliqué par ce post.
la source
La fonction shell suivante, basée uniquement sur les commandes et options standard POSIX, devrait fonctionner sur la plupart des systèmes Unix et Linux (sinon aucun). :
Notez qu'il s'étouffera lorsqu'il passera le nom de commande douteux "0]" et échouera également à identifier les processus ayant un espace intégré dans leurs noms.
Notez également que la solution la plus votée et acceptée nécessite des
ps
options non portables et utilise gratuitement un shell qui, malgré sa popularité, n'est pas garanti d'être présent sur toutes les machines Unix / Linux (bash
)la source
$ isPidRunning 0]
affiche par exemple "0] est en cours d'exécution 3 [ksoftirqd / 0] 8 [rcuop / 0] 17 [rcuos / 0] 26 [rcuob / 0] 34 [migration / 0] 35 [watchdog / 0]" ici.