Como obter o pid de um processo em execução usando um único comando que analisa a saída do ps?

22

Estou procurando uma única linha que retorne o pid de um processo em execução.

Atualmente tenho:

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

E isso retorna o punho pid, command. Eu preciso apenas do primeiro número da saída e ignore o resto. Suponho sedou awkajudaria aqui, mas minha experiência com eles é limitada.

Além disso, isso tem outro problema, ele retornará o pid do grep se o xxx não estiver em execução.

É realmente importante ter uma única linha, pois quero reutilizar a saída para fazer outra coisa, como matar esse processo.

sorin
fonte
1
passe pela cabeça e especifique a linha para retornar com -n 1?
Mike McMahon

Respostas:

28

Se você quiser apenas o pid do processo, poderá usá-lo, pgrepse disponível. pgrep <command>retornará o pid do comando (ou lista de pids no caso de haver mais de uma instância do comando em execução; nesse caso, você poderá usar headou outros comandos apropriados)
Espero que isso ajude!

another.anon.coward
fonte
+1 Meu uso habitual de pgrep:kill `pgrep xxx`
Steve
20
@ Steve: Talvez você devesse olhar pkill.
Pausado até novo aviso.
7

Apenas mais um comando necessário; você deseja apenas o primeiro campo de uma linha de valores separados por espaço:

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

Bem dois. Eu adicionei outro grep para remover o próprio grep da saída.

chepner
fonte
6

Basta usar o pgrep, é muito mais direto

pgrep -o -x xxxx

O exemplo acima seleciona o processo mais antigo com o nome exato


fonte
E como o OP deseja usar o comando para interromper o processo pkill(com os mesmos argumentos) seria a escolha mais direta.
precisa saber é o seguinte
2

pidof xxx será suficiente no linux

herve3527
fonte
0

Rodando no Cygwin, não posso usar -A e -o, mas algo como isto:

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

você pode fazer algo como

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

então xxx deve ser o nome do processo e ele não capturará grep por causa da âncora ^

pizza
fonte