webentwicklung-frage-antwort-db.com.de

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

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 den ersten pid, command zurück. Ich brauche nur die erste Nummer aus der Ausgabe und ignoriere den Rest. Ich nehme an, sed oder awk würden 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.

22
sorin

Wenn Sie nur die PID des Prozesses möchten, können Sie pgrep verwenden, falls 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 head oder andere geeignete Befehle verwenden).
Hoffe das hilft!

28

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.

7
chepner

Verwenden Sie einfach pgrep, es ist viel einfacher

pgrep -o -x xxxx

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

6
Lenny

pidof xxx wird unter Linux ausreichen

1
herve3527

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
0
AlG

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 übernommen ^

0
pizza