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.


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!


+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.


6

Basta usar o pgrep, é muito mais direto

pgrep -o -x xxxx

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


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


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

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 ^

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.