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.
Antworten:
Der
-v
Schalter von grep kehrt das Ergebnis um und schließt es aus der Warteschlange aus. Also mach es so:Upd . Sie können
-C
switch auch verwenden , um den Befehlsnamen wie folgt anzugeben:Letzteres
-o
bestimmt, welche Spalten der Informationen in der Liste enthalten sein sollen.pid
Listet nur die Prozess-ID-Spalte auf. Und das Gleichheitszeichen=
nachpid
bedeutet, dass es keinen Spaltentitel für diesen gibt, sodass Sie nur die eindeutigen Zahlen - PIDs - erhalten.Hoffe das hilft.
quelle
Sie können einen Zeichenklassentrick verwenden. "[d]" stimmt nicht mit "[d]" überein, nur mit "d".
Ich bevorzuge dies zu verwenden
| grep -v grep
.quelle
| grep -v grep
werde leichter zu verstehen sein, wenn ich meinen Code überarbeite."[d]" does not match "[d]" only "d"
?grep
Befehl nicht mit derps
Ausgabezeile für dengrep
Befehl selbst übereinstimmt (was in der ursprünglichen Frage "eine zweite PID" genannt wurde). Ausdrucka[xy]d
stimmt nicht mit Text überein,a[xy]d
aber er stimmt mit Textaxd
oder Text übereinayd
. Daher[f]oo
stimmt der Ausdruck mit dem Text überein,foo
jedoch nicht mit dem Text[f]oo
. Ich hoffe das ist klar.Vermeiden Sie das Parsen
ps
der Ausgabe, wenn es zuverlässigere Alternativen gibt.quelle
pgrep
Suche nach Teilstring undpidof
exakter Übereinstimmung - genau das, was ich brauchte! Vielen Dank!Die
ps -C
Option 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 aux
Zeigt die vollständige Liste der Prozesse auf den meisten Unix-basierten Systemen an undawk
wird normalerweise standardmäßig installiert.quelle
Verwenden Sie
pgrep
diese Option, um die PID eines Prozesses nach Namen zu suchen:Mit zusätzlichem Prozessnamen im Ergebnis (
-l
):Suchen Sie den Prozessnamen (
-l
) und die Argumente (-f
) und zeigen Sie sie an :Das Gute daran
pgrep
ist, dass es sich niemals als Spiel meldet. Sie müssen jedoch nicht die PID abrufenpgrep
und dann den entsprechenden Prozess abbrechenkill
. Verwenden Siepkill
stattdessen:Geben Sie das
SIGKILL
Signal (-9
oder-KILL
) anstelle vonSIGTERM
(standardmäßig) an:Suchen Sie nach dem Prozessnamen (
-l
) und den Argumenten (-f
) und fordern Sie eine Bestätigung (-I
) an, bevor Sie ihn mit einemSIGKILL
Signal (-9
oder-KILL
) beenden:Beachten Sie, dass diese
-I
Option nur bei einigen Versionen verfügbar istpkill
, z. B. bei OS X Mavericks.quelle
Wenn Sie bash verwenden, können Sie dies auch folgendermaßen tun, indem Sie verwenden
ps -eaf
quelle
ps -eaf | grep "process_name" | awk '{print $2}'
Diese Zeile gibt die PID (Prozess-ID) ohne "grep" zurück.
quelle