2017-08-26 2 views
0

Ich versuche, die Prozeßnummer von diesem BefehlCapturing Ausgabe von grep und geschnitten, um eine Variable in tcsh Shell

ps ax | grep catalina 

auf eine Variable in tcsh Schale zu erfassen.

Bisher bin ich in der Lage, den Prozess Nummer auf den Bildschirm Echo dieses Skript:

set pnum = `ps ax | grep catalina` 
echo $pnum | cut -d' ' -f1 

Aber wenn ich versuche, das das Ergebnis sowohl der grep und die cut

set pnum = `ps ax | grep catalina | cut -d' ' -f1` 
zu erhalten

Das Ergebnis ist eine leere Zeichenfolge.

Und diese Sequenz

set pnum = `ps ax | grep catalina` 
set pnum = `$pnum | cut -d' ' -f1` 

erzeugt ein 1104: Command not found. Fehler.

Was fehlt mir?

Antwort

0

Sie müssen Ihren Prozess noch weiter dekonstruieren (vielleicht haben Sie). Um Ihr Problem zuerst zu verstehen, sehen Sie, was ps ax | grep catalina anzeigt, DANN fügen Sie die set pnum =.. Sachen hinzu.

Ja, Sie sollten in der Lage sein, es in eine Pipeline zu verketten, aber beachten Sie, dass, wenn Leerzeichen am Anfang der Ausgabe sind, Sie Ihre -f1 für jeden Raum inkrementieren müssen, also eine 4-stellige PID erfordert mehr -f**n** als eine 6-stellige PID.

Beachten Sie auch, dass die grep Linie zu entfernen, die,

| grep '[c]atalina' 

und schließlich verwenden erscheint, darüber nachzudenken, was Ihre Fehlermeldung 1104: Command not found. Ihnen sagt.

Das ist die Prozess-ID $pnum, die Sie an der Vorderseite Ihrer zweiten Zeile haben. Wenn Sie sich angewöhnen, fehlerhaften Code zu dekonstruieren, können Sie leicht erkennen, wo die Probleme liegen. Sie können den Shell-Debug-Trace auch mit #!/bin/tcsh -vx als She-Bang-Zeile für Ihr Skript aktivieren.


Eine eventuell bessere Lösung verwenden

set pnum = `ps ax | awk '/[c]atalina/{sub(/^ */,"", $0);print $1}'` 

Mein csh/tcsh Umwelt ist im Moment wirkt, also nur leicht getestet.

IHTH.

+0

Danke für die Tipps. Ausgabe von meinem grep ist '1104 s002 S 6: 25.87/Bibliothek/Java/J ...' Also wenn ich das stattdessen tue: setze pnum = 'ps ax | grep catalina | Schnitt -d '' -f 2 | cut -d '' -f 1', pnum kommt jetzt zurück –

+0

Danke für die Tipps. Ausgabe meiner grep ist 1104 s002 S 6: 25,87 /Library/Java/JavaVirtualMachines/jdk1.7.0_51.jdk/Contents/Home/jre/bin/java -Djava.util.logging.config.file =/Benutzer/stephenschultz/apache-tomcat-7.0.55/conf/logging.properties -Djava.util.logging.manager = org.apache ... Also wenn ich dies anstelle des Befehls in meinem ursprünglichen Beitrag gesetzt pnum = 'ps ax | grep catalina | Schnitt -d '' -f 2 | cut -d '' -f 2 pnum kommt zurück mit Woher kommt das extra 8895? –

+0

Was passiert, wenn Sie eine PID erhalten, die nur 3 Stellen lang ist? oder 5 oder 6? Außerdem erstellen Sie eine sehr "teure" Lösung, indem Sie drei Prozesse haben, um den benötigten Wert zu "trimmen". Die "awk" Lösung, die ich einschließe, behandelt jede Größe einer PID und ist nur ein Prozess. Aber ich bin froh, dass Sie sich selbst ein Bild machen. Viel Glück. – shellter

0

Geben Sie einen Versuch pgrep:

set npid = `pgrep -n nginx` 
echo $npid 

Die -n den neuesten (zuletzt gestartet) zu erhalten, ist Prozess

Dies funktioniert auch (die Methode, die Sie verwenden):

set pnum = `ps ax | grep nginx | cut -d ' ' -f1` 

Was passieren könnte, ist, dass Ihr Prozess nicht ausgeführt wird oder dass am Anfang der Zeile einige zusätzliche Leerzeichen stehen. Wahrscheinlich werden Sie auch hav e, so etwas zu tun:

set pnum = `ps ax | grep nginx | grep -v grep | cut -d ' ' -f3` 

oder benutzen awk:

set pnum = `ps ax | awk '/nginx/{print $1}'` 
+0

Das hat funktioniert: set pnum = 'ps ax | grep catalina | grep -v grep | schneiden -d '' -f2'. Vielen Dank! –

Verwandte Themen