¿Cómo obtener el pid de un proceso en ejecución usando un solo comando que analiza la salida de ps?

22

Estoy buscando una sola línea que devuelva el pid de un proceso en ejecución.

Actualmente tengo:

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

Y esto devuelve el puño pid, command. Solo necesito el primer número de la salida e ignoro el resto. Supongo sedo awkayudaría aquí, pero mi experiencia con ellos es limitada.

Además, esto tiene otro problema, devolverá el pid de grep si xxx no se está ejecutando.

Es realmente importante tener una sola línea, ya que quiero reutilizar la salida para hacer otra cosa, como matar ese proceso.

Sorin
fuente
1
canalizarlo a través de la cabeza y especificar la línea para volver con -n 1?
Mike McMahon

Respuestas:

28

Si solo desea el pid del proceso, puede utilizarlo pgrepsi está disponible. pgrep <command>devolverá el pid del comando (o la lista de pids en caso de que se esté ejecutando más de una instancia del comando, en cuyo caso puede usar headu otros comandos apropiados) ¡
Espero que esto ayude!

otro.anon.coward
fuente
+1 Mi uso habitual de pgrep:kill `pgrep xxx`
Steve
20
@steve: Quizás deberías mirar pkill.
Pausado hasta nuevo aviso.
7

Solo se necesita un comando más; solo desea el primer campo de una línea de valores separados por espacios:

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

Bueno dos. Agregué otro grep para eliminar grep de la salida.

chepner
fuente
6

Solo usa pgrep, es mucho más sencillo

pgrep -o -x xxxx

Lo anterior selecciona el proceso más antiguo con el nombre exacto


fuente
Y dado que OP quiere usar el comando para matar el proceso, pkill(con los mismos argumentos) sería la opción más directa.
bstpierre
2

pidof xxx bastará en linux

herve3527
fuente
0

Ejecutando en Cygwin, así que no puedo usar -A y -o, pero algo como esto:

$ 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
fuente
0

puedes hacer algo como

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

entonces xxx debe ser el nombre del proceso y no recogerá grep debido al ancla ^

Pizza
fuente