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
4 Réponses :
Vous ne faites pas de test. Mettez des crochets autour de la condition de test comme: p>
Si [conditionner votre test] p>
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 !!
Essayez cela à la place:
pgrep Processname | grep -v $$ | grep -q -v $PPID if [ $? -eq 0 ]; then echo "running" else echo "not running" fi
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.
probablement parce que comme une alternative que vous aimeriez essayer le grep "ProcessName" code> se trouve. J'ai trouvé ce même problème hier, sauf que j'étais
xarg code> les résultats à
tuer code> ...
pgrep code> commande au lieu de votre chaîne de
PS code> et divers
grep code> s: p>
@Stephen, non, l'OP exclut les lignes PS contenant "grep" au milieu de son pipeline d'origine.
g'day,
comme un de côté, au lieu de p> essayez de faire p> 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". P> Grevre pour "[P] ROCESSNAME" Juste "ProcessName" seul, mais pas la chaîne "grep [p] rocessname". p> p>
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 ...
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 code> un idiome aussi commun? Utilisez
si commande; alors x; autre y; fi code>. En outre, pourquoi
echo $ "foo" code> au lieu de
echo "foo" code>?