Ausschluss von grep aus der Prozessliste

27

Ich habe einen Befehl zusammengestellt, um die Prozess-ID eines laufenden Daemons zurückzugeben:

ps aux | grep daemon_name | awk "{ print \$2 }"

Es funktioniert einwandfrei und gibt die PID zurück, aber es gibt auch eine zweite PID zurück, die vermutlich der Prozess ist, den ich gerade ausführe. Kann ich meinen Befehl von der Liste der zurückgegebenen PIDs ausschließen?

Ich habe es einige Male getestet und es scheint, dass mein Befehl immer die zweite PID in der Liste ist, aber ich möchte nicht nur die erste PID abrufen, falls sie ungenau ist.

tak
quelle

Antworten:

27

Der -vSchalter von grep kehrt das Ergebnis um und schließt es aus der Warteschlange aus. Also mach es so:

ps aux | grep daemon_name | grep -v "grep daemon_name" | awk "{ print \$2 }"

Upd . Sie können -Cswitch auch verwenden , um den Befehlsnamen wie folgt anzugeben:

ps -C daemon_name -o pid=

Letzteres -obestimmt, welche Spalten der Informationen in der Liste enthalten sein sollen. pidListet nur die Prozess-ID-Spalte auf. Und das Gleichheitszeichen =nach pidbedeutet, dass es keinen Spaltentitel für diesen gibt, sodass Sie nur die eindeutigen Zahlen - PIDs - erhalten.

Hoffe das hilft.

Serg ikS
quelle
2
Verwenden von "grep -v grep": Beachten Sie, dass Sie möglicherweise eine lange Befehlszeile mit "grep" haben (Nehmen wir an, jemand hat eine grep-Bibliothek geschrieben => "-Llibgrep.so" oder "-cp libgrep.jar". Zumindest Ich würde das Muster wiederholen: grep -v "grep daemon_name"
phil_w
Guter Punkt, @phil_w, danke. Die Antwort wurde aktualisiert.
Serg ikS
23

Sie können einen Zeichenklassentrick verwenden. "[d]" stimmt nicht mit "[d]" überein, nur mit "d".

 ps aux | grep [d]aemon_name | awk "{ print \$2 }"

Ich bevorzuge dies zu verwenden | grep -v grep.

RedGrittyBrick
quelle
Heh das ist ein kluger Trick, ich mag es. Ich halte die Dinge im Moment einfach, während ich lerne, und | grep -v grepwerde leichter zu verstehen sein, wenn ich meinen Code überarbeite.
Nehmen Sie
Ich versuche zu verstehen, wie das funktioniert. Könnten Sie bitte erklären, was Sie damit meinen "[d]" does not match "[d]" only "d"?
Nowaker
@Damian: Die eckigen Klammern sind Metazeichen (die eine Reihe von Zeichen abgrenzen) im Suchausdruck, sodass der grepBefehl nicht mit der psAusgabezeile für den grepBefehl selbst übereinstimmt (was in der ursprünglichen Frage "eine zweite PID" genannt wurde). Ausdruck a[xy]dstimmt nicht mit Text überein, a[xy]daber er stimmt mit Text axdoder Text überein ayd. Daher [f]oostimmt der Ausdruck mit dem Text überein, foojedoch nicht mit dem Text [f]oo. Ich hoffe das ist klar.
RedGrittyBrick
Okay, ich habe mich bei ARGV geirrt. Dies ist nur ein regulärer Ausdruck. Vielen Dank.
Nowaker
Teuflisch schlau! Musste einen Moment darüber nachdenken - danke!
Subfuzion
15

Vermeiden Sie das Parsen psder Ausgabe, wenn es zuverlässigere Alternativen gibt.

pgrep daemon_name
pidof daemon_name
Grawity
quelle
Nun, endlich macht Prozessmanagement Sinn.
Błażej Michalik
pgrepSuche nach Teilstring und pidofexakter Übereinstimmung - genau das, was ich brauchte! Vielen Dank!
Sasha
3

Die ps -COption ist nicht auf allen Unix-basierten Systemen universell, funktioniert jedoch auf Ihren Systemen. Stattdessen würde ich grep ganz vermeiden:

ps aux | awk '/daemon_name/ && !/awk/ { print $2 }'

Sie müssen nichts in einfachen Anführungszeichen setzen. ps auxZeigt die vollständige Liste der Prozesse auf den meisten Unix-basierten Systemen an und awkwird normalerweise standardmäßig installiert.

MOG73
quelle
3

Verwenden Sie pgrepdiese Option, um die PID eines Prozesses nach Namen zu suchen:

pgrep proc_name

Mit zusätzlichem Prozessnamen im Ergebnis ( -l):

pgrep -l proc_name

Suchen Sie den Prozessnamen ( -l) und die Argumente ( -f) und zeigen Sie sie an :

pgrep -lf proc_name_or_argument

Das Gute daran pgrepist, dass es sich niemals als Spiel meldet. Sie müssen jedoch nicht die PID abrufen pgrepund dann den entsprechenden Prozess abbrechen kill. Verwenden Sie pkillstattdessen:

pkill proc_name

Geben Sie das SIGKILLSignal ( -9oder -KILL) anstelle von SIGTERM(standardmäßig) an:

pkill -9 proc_name

Suchen Sie nach dem Prozessnamen ( -l) und den Argumenten ( -f) und fordern Sie eine Bestätigung ( -I) an, bevor Sie ihn mit einem SIGKILLSignal ( -9oder -KILL) beenden:

pkill -KILL -Ilf proc_name_or_argument

Beachten Sie, dass diese -IOption nur bei einigen Versionen verfügbar ist pkill, z. B. bei OS X Mavericks.

Rockallit
quelle
0

Wenn Sie bash verwenden, können Sie dies auch folgendermaßen tun, indem Sie verwenden ps -eaf

PIDS=$(ps -eaf)
PID=$(echo "$PIDS" | grep "process_name" | awk '{print $2}')
echo $PID
Shubham Khatri
quelle
Das ist unnötig komplex. Warum nicht einfach anrufenps -eaf | grep "process_name" | awk '{print $2}'
David Nedrow
0

Diese Zeile gibt die PID (Prozess-ID) ohne "grep" zurück.

PID=$(ps aux | grep '/usr/bin/python2.7 manage.py SES__boto3_sqs_read' | grep -v grep)
Brian Sanchez
quelle
Eine Erklärung wäre nett.
Davidbaumann
Dies ist im Grunde das Gleiche wie die akzeptierte Antwort, jedoch mit unterschiedlicher Dekoration.
Scott