Wie erhält man die PID eines laufenden Prozesses mit einem einzigen Befehl, der die Ausgabe von ps analysiert?

22

Ich suche nach einer einzelnen Zeile, die die PID eines laufenden Prozesses zurückgibt.

Derzeit habe ich:

ps -A -o pid,cmd|grep xxx|head -n 1

Und das gibt die Faust zurück pid, command. Ich brauche nur die erste Nummer aus der Ausgabe und ignoriere den Rest. Ich nehme an sedoder awkwürde hier helfen, aber meine Erfahrung mit ihnen ist begrenzt.

Auch dies hat ein anderes Problem, es wird die pid von grep zurückgeben, wenn das xxx nicht läuft.

Es ist wirklich wichtig, eine einzige Zeile zu haben, da ich die Ausgabe wiederverwenden möchte, um etwas anderes zu tun, beispielsweise diesen Prozess zu beenden.

Sorin
quelle
1
Leiten Sie es durch den Kopf und geben Sie die zurückzugebende Zeile mit -n 1 an.
Mike McMahon

Antworten:

28

Wenn Sie nur die pid des Prozesses möchten, können Sie verwenden, pgrepwenn verfügbar. pgrep <command>Gibt die PID des Befehls zurück (oder eine Liste von PIDs, falls mehr als eine Instanz des Befehls ausgeführt wird; in diesem Fall können Sie einen headoder andere geeignete Befehle verwenden).
Hoffe, dies hilft!

ein anderer
quelle
+1 Meine übliche Verwendung von pgrep:kill `pgrep xxx`
Steve
20
@steve: Vielleicht solltest du mal schauen pkill.
Bis auf weiteres angehalten.
7

Nur noch ein Befehl erforderlich; Sie möchten nur das erste Feld aus einer Zeile mit durch Leerzeichen getrennten Werten:

ps -A -o pid,cmd|grep xxx | grep -v grep |head -n 1 | awk '{print $1}'

Gut zwei. Ich habe ein weiteres grep hinzugefügt, um grep selbst aus der Ausgabe zu entfernen.

chepner
quelle
6

Verwenden Sie einfach pgrep, es ist viel einfacher

pgrep -o -x xxxx

Oben wird der älteste Prozess mit dem genauen Namen ausgewählt


quelle
Und da OP den Befehl verwenden möchte, um den Prozess pkillabzubrechen, wäre (mit den gleichen Argumenten) die direkteste Wahl.
bstpierre
2

pidof xxx wird unter Linux ausreichen

herve3527
quelle
0

Läuft auf Cygwin, daher kann ich -A und -o nicht verwenden, aber so ähnlich:

$ ps
      PID    PPID    PGID     WINPID   TTY     UID    STIME COMMAND
     4580       1    4580       4580  ?       55573   May 21 /usr/bin/mintty
     5808    7072    5808       7644  pty3    55573 13:35:31 /usr/bin/ps
     7072    5832    7072       6424  pty3    55573   May 21 /usr/bin/bash


$ ps | grep '/usr/bin/mintty' | head -n 1 | awk '{print $1}'
4580
AlG
quelle
0

Sie können so etwas tun

ps -A -o cmd,pid | egrep "^xxx " | head -n 1 | sed -r -e 's/.* ([0-9]+)$/\1/'

dann muss xxx der Prozessname sein und grep wird wegen des Ankers nicht aufgenommen ^

Pizza
quelle