2016-04-18 12 views
-1

ich bin neu im Bash-Scripting und ich muss feststellen, ob ein Prozess in einer Linux-Umgebung läuft. Eigentlich benutze ich die Folge Befehl, um die Arbeit zu erledigen:grep eine Variable, die Sonderzeichen enthält

#ps -ef | awk '{print substr($0, index($0,$8))}' | grep -v grep | grep -w -F $PROCESSNAME 

wo

awk '{print substr($0, index($0,$8))}' 

mir erlauben Felder UID PID PPID C STIME TTY TIME und mir

grep -v grep 

erlauben zu ignorieren Ignoriere die Zeile, die den Befehl selbst enthält. An dieser Stelle habe ich eine Liste aller Prozesse, die auf dem System laufen.

Endlich:

grep -w -F $PROCESSNAME 

lesen eine Variable, die den Namen des Prozesses enthält, die ich überprüfen möchten. Für das, was ich verstehe, sollte der vollständige Befehl nur die Zeile zurück, die den genauen Wert von $ PROCESS

Eigentlich nicht, die dem Muster „[Prozessnamen]“, und wahrscheinlich auch für andere Muster folgen arbeitet für Prozesse richtig dies nicht hat .

Zum Beispiel zu vereinfachen, wenn ich einen laufenden Prozess namens habe „[vmmemctl]“ und ich laufe:

#ps -ef | grep -v grep | grep -w -F "vmmemctl]" 

es gibt tatsächlich ein Ergebnis:

#root  615  2 0 Feb26 ?  00:01:00 [vmmemctl] 

aber die eigentlichen Prozessnamen Der Befehl unterscheidet sich vom Prozessnamen im Ergebnis. Was ist der richtige Befehl, der dieses Verhalten nicht hat?

Danke

+3

Verwenden Sie einfach 'pgrep' und nennen .. – heemayl

+0

oder' pidof' oder ... – twalberg

Antwort

0

awk zur Rettung!

ps -ef | awk '$8=="[command]"{NF=8;print}' 

oder

ps -ef | awk -v c="vmmemctl]" '$8==c{NF=8;print}' 

beachten Sie, dass diese für eine genaue Übereinstimmung ist nicht Muster.

Da dies eine exakte Übereinstimmung ist, kann der Befehl Leerzeichen und andere Sonderzeichen enthalten (es ist keine Musterübereinstimmung, sondern Zeichenkettengleichheit). Arbeiten mit dem Variablennamen es es wie folgt ein Tag aussehen wird

ps -ef | awk -v c="$PROCESSNAME" '$8==c{NF=8;print}' 
+0

Sorry, aber das funktioniert nicht. Was ich brauche, ist der Befehl, der (falls vorhanden) nur die Zeile mit dem Prozessnamen zurückgibt, die genau der Zeichenkette entspricht, die in der Variablen $ PROCESSNAME enthalten ist. Ein Prozessname kann auch Leerzeichen enthalten. Zum Beispiel habe ich in meiner Umgebung einen Prozess namens "/ sbin/rsyslogd -i /var/run/syslogd.pid -c 5". Trotzdem danke. – simone

+0

das ist genau der Punkt. Es ist keine Musterübereinstimmung, sondern eine exakte Zeichengleichheit – karakfa

Verwandte Themen