if-statement est toujours évalué à TRUE

Y a-t-il une raison pour laquelle ce script renvoie toujours “en cours d’exécution”, que mon processus soit démarré ou arrêté?

if ps ax | grep -v grep | grep "processName" > /dev/null then echo $"running" else echo $"not running" fi 

Merci beaucoup

MISE À JOUR: J’ajoute un exemple complet de mon script, il y a peut-être quelque chose qui ne va pas ailleurs.

 case "$1" in start) # Start daemons. echo -n $"Starting daemon: " ;; stop) # Stop daemons. echo -n $"Shutting down: " echo ;; status) pgrep -f "ProcessName" > /dev/null if [ $? -eq 0 ]; then echo $"ProcessName is running" else echo $"ProcessName is not running" fi ;; restart) $0 stop $0 start ;; *) echo $"Usage: $0 {start|stop|status|restart}" exit 1 esac 

MISE À JOUR 2:

 [user@dev init.d]# pgrep -f "MyProcess" > /dev/null [user@dev init.d]# echo $? 0 [user@dev init.d]# service MyProcess stop Shutting down MyProcess: Terminated [user@dev init.d]# pgrep -f "MyProcess" > /dev/null [user@dev init.d]# echo $? 1 

Mais if [ $? -eq 0 ]; then if [ $? -eq 0 ]; then if [ $? -eq 0 ]; then semble être VRAI tout le temps

Essayez plutôt ceci:

 ps aux | grep -q "[p]rocessName" if [ $? -eq 0 ]; then echo "running" else echo "not running" fi 

Les parenthèses autour de la première lettre de processName signifient ne pas avoir besoin de “grep -v grep”, tandis que -q signifie que nous n’avons pas besoin de pipe pour / dev / null

$? vous donne le code de retour de la commande précédente exécutée. Par conséquent, tester s’il était à 0 indiquerait si “grep” a trouvé ce qu’il cherchait.

Mettre à jour

Si le nom de votre processus est vraiment court (par exemple “cup”), vous pouvez obtenir un faux positif, car il peut également correspondre à d’autres processus (par exemple “cupsd”). Vous pouvez surmonter cela en faisant en sorte que grep corresponde à des mots entiers – ajoutez le drapeau “-w”.

Non que cette technique ne soit pas parfaite. Vous pouvez vous retrouver avec des entrées correspondantes dans les champs nom d’utilisateur / date. Si cela se produit, recherchez “man ps” et soyez plus sélectif sur ce que vous imprimez avant de faire un grep. Préférez la sortie avec awk pour extraire uniquement la colonne affichant le nom process / cmd. Par exemple:

 ps aux | awk '{print $11}' | grep -q -w "[p]rocessName" if [ $? -eq 0 ]; then echo "running" else echo "not running" fi 

Mise à jour 2

vous pouvez également utiliser pgrep comme suggéré dans la réponse ci-dessous.

Pour des noms de processus très courts, vous pouvez spécifier des limites de mots (\ b) avant et après le nom de votre processus pour éviter le surclassement (comme décrit ci-dessus).

 pgrep "\bprocname\b" > /dev/null if [ $? -eq 0 ]; then echo "running" else echo "not running" fi 

Mise à jour 3

À partir de la question mise à jour, je constate que vous l’exécutez à partir d’un script d’initialisation. Il y a toujours un danger de pgrep correspondant au script lui-même. Essayer:

 pgrep Processname | grep -q -v $$ if [ $? -eq 0 ]; then echo "running" else echo "not running" fi 

Cela exclut le PID du script des correspondances pgrep.

Mise à jour 4

(mise à jour finale? doigts croisés)

Si le script init est exécuté via la commande “service”, nous devons également filtrer le PID parent. Que diriez-vous:

 pgrep Processname | grep -v $$ | grep -q -v $PPID if [ $? -eq 0 ]; then echo "running" else echo "not running" fi 

Probablement parce que grep "processName" se trouve lui-même. J’ai retrouvé ce même problème hier, sauf que je xarg les résultats pour kill

Comme alternative, vous pouvez essayer la commande pgrep au lieu de votre chaîne de ps et de plusieurs grep :

 sd@camel:~$ pgrep bash 415 3477 sd@camel:~$ echo $? 0 sd@camel:~$ pgrep arf sd@camel:~$ echo $? 1 

G’day,

En réserve, au lieu de

 ps ax | grep -v grep | grep "processName" 

Essayez de faire

 ps ax | grep "[p]rocessName" 

Le ps répertorie la fonction grep car il voit la chaîne “grep processName” dans la liste de processus qui est passée par votre grep pour la chaîne “processName”.

Grepping pour “[p] NomRocess” correspondra simplement à “processName”, mais pas à la chaîne “grep [p] rocessName”.

vous ne faites pas de test. placer les parenthèses autour de la condition d’essai comme ceci:

si [conditionnez vos tests]