7
votes

if-déclaration évalue toujours à vrai

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

[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


7 commentaires

Pour répondre à votre question, oui il y a. ;-)


@Mike, que voyez-vous lorsque vous supprimez la redirection de sortie sur / dev / null? Votre processus est-il ou quelque chose de même nommé, en fait, en cours d'exécution?


@pilcrow, lorsque mon processus est démarré, je vois le résultat de mon processus, lorsque le processus est arrêté, je ne vois aucun résultat.


@Mike, Permettez-moi de clarifier: Que voyez-vous de votre code IF / Grep / Echo - le code que vous avez publié - lorsque la redirection / dev / null est supprimée? Montrez-nous les deux lorsque le processus est "commencé" et quand "arrêté". Voyez-vous une ou plusieurs lignes de sortie PS? (Peut-être que votre processus est SIGSTOP'D, peut-être qu'un autre a un nom similaire, etc.) Merci.


@Pilcrow, a commencé: 6628 pts / 0 SL 0:17 /Opt/jrockit1.5.0_14/bin/java ..... non commencé: rien


Je suppose que le "PRPC-FRC NomName" correspond au nom de votre script, donc chaque fois que vous exécutez votre script, cela vous donne un faux positif.


Pourquoi la commande est-elle? Si [$? -eq 0]; alors x; autre y; fi un idiome aussi commun? Utilisez si commande; alors x; autre y; fi . En outre, pourquoi echo $ "foo" au lieu de echo "foo" ?


4 Réponses :


-1
votes

Vous ne faites pas de test. Mettez des crochets autour de la condition de test comme:

Si [conditionner votre test]


4 commentaires

Sans [], le SI teste l'état de sortie de la commande donnée, son script est donc (dans le bon esprit) essayant de tester la sortie de Grep.


@Emil oui efficacement pas testant la condition qu'il veut !! En fait, si une foisAccessiblecommand sans crochets revient vrai


Le problème de l'OP est que le GREP est revenu vrai lorsqu'il s'est trouvé, pas l'utilisation de si.


@Emil je n'ai pas dit qu'il ne devrait pas utiliser le si simplement qu'utiliser [] syntaxiquement fait ce que sa sémantique nécessite !!



16
votes

Essayez cela à la place:

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


10 commentaires

Hé, c'est en fait une astuce astucieuse avec le [p] rocessname - +1 pour prouver de vieux chiens peut apprendre de nouvelles astuces.


Il devrait simplement être capable de "si PS AUX | grep -q "[p] rocessname"; Puis echo en cours d'exécution; sinon écho pas en cours d'exécution; Fi 'L'essai supplémentaire en utilisant [est inutile.


@Mike: Quel nom de processus êtes-vous grepping. S'il est renvoyé en cours d'exécution tout le temps que vous avez essayé, il doit également correspondre également à un autre nom de processus également (ou nominatifs, données ou données, ou toute autre sortie de 'PS AUX').


@LSC: Non lorsque j'exécute la commande elle-même, rien n'est retourné lorsque le processus est arrêté.


@Mike: Répondez à jour avec plus d'informations. Désolé, mais je n'obtiens pas ce que vous voulez dire par "rien n'est retourné lorsque le processus est arrêté".


Ok je pense que toutes tes réponses sont bonnes. Mais il y a quelque chose qui ne va pas avec mon script. Si j'ouvre une ligne de commande et que je tapez pgrep -f "MyProcessName", il n'y a aucun résultat lorsque le processus est arrêté. Lorsque je mets cette ligne dans une déclaration II, elle retourne toujours en cours d'exécution. C'est très étrange.


@MIKE: Réponse Mise à jour pour cas où votre script a le même nom que le processus en question.


Oui, je pense que tu as raison du problème, mais la solution ne semble pas fonctionner.


Expérience rapide. Est-ce que cela fonctionne si vous appelez votre script à l'aide de "/etc/init.d/processname Statut" au lieu d'un "statut de processus de service" ??


Réponse mise à jour pour inclure cas où script est exécuté via une autre commande / script.



2
votes

probablement parce que grep "ProcessName" se trouve. J'ai trouvé ce même problème hier, sauf que j'étais xarg les résultats à tuer ...

comme une alternative que vous aimeriez essayer le pgrep commande au lieu de votre chaîne de PS et divers grep s: xxx


1 commentaires

@Stephen, non, l'OP exclut les lignes PS contenant "grep" au milieu de son pipeline d'origine.



1
votes

g'day,

comme un de côté, au lieu de xxx

essayez de faire xxx

le ps répertorie la fonction Grep car il consiste à voir la chaîne "ProcessAnom de Grep" dans la liste de processus qui est passée par votre grep pour la chaîne "ProcessName".

Grevre pour "[P] ROCESSNAME" Juste "ProcessName" seul, mais pas la chaîne "grep [p] rocessname".


1 commentaires

Bonne observation. pGrep, ou `` ps Ax -o commun | Grep -q -W CommandName '', ou un nombre quelconque de produits de la bourse fera. Mais ce sont des commentaires sur le problème de l'OP, pas des réponses ...