Come ottenere il pid di un processo in esecuzione usando un singolo comando che analizza l'output di ps?


22

Sto cercando una sola riga che restituisca il pid di un processo in esecuzione.

Attualmente ho:

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

E questo restituisce il pugno pid, command. Mi serve solo il primo numero dall'output e ignoro il resto. Suppongo sedo awkaiuterei qui, ma la mia esperienza con loro è limitata.

Inoltre, questo ha un altro problema, restituirà il pid di grep se il xxx non è in esecuzione.

È davvero importante avere una sola riga, poiché voglio riutilizzare l'output per fare qualcos'altro, come uccidere quel processo.


1
passare attraverso la testa e specificare la riga da restituire con -n 1?
Mike McMahon,

Risposte:


28

Se vuoi solo il pid del processo, puoi utilizzarlo pgrepse disponibile. pgrep <command>restituirà il pid del comando (o un elenco di pid nel caso in cui vi siano più istanze del comando in esecuzione, nel qual caso è possibile utilizzare heado altri comandi appropriati)
Spero che questo aiuti!


+1 Il mio solito uso di pgrep:kill `pgrep xxx`
Steve,

20
@steve: forse dovresti dare un'occhiata pkill.
In pausa fino a nuovo avviso.

7

È necessario solo un altro comando; vuoi solo il primo campo da una riga di valori separati da spazio:

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

Bene, due. Ho aggiunto un altro grep per rimuovere grep stesso dall'output.


6

Basta usare pgrep, è molto più semplice

pgrep -o -x xxxx

Quanto sopra seleziona il processo più vecchio con il nome esatto


E poiché OP vuole usare il comando per terminare il processo, pkill(con gli stessi argomenti) sarebbe la scelta più diretta.
bstpierre,


0

In esecuzione su Cygwin, quindi non posso usare -A e -o, ma qualcosa del genere:

$ 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

puoi fare qualcosa del genere

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

allora xxx deve essere il nome del processo e non raccoglierà grep a causa dell'ancora ^

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.