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

21

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 primeiro pid, command . Eu preciso apenas do primeiro número da saída e ignoro o resto. Suponho que sed ou awk ajudaria 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 rodando.

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

    
por sorin 23.05.2012 / 19:25

6 respostas

26

Se você quer apenas o pid do processo, você pode fazer uso de pgrep se disponível. pgrep <command> retornará o pid do comando (ou lista de pids caso haja mais de uma instância do comando em execução, caso em que você poderá usar head ou outros comandos apropriados)
Espero que isso ajude!

    
por 23.05.2012 / 19:38
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.

    
por 23.05.2012 / 19:35
5

Use o pgrep, é muito mais direto

pgrep -o -x xxxx

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

    
por 25.08.2012 / 00:08
1

pidof xxx será suficiente no linux

    
por 29.02.2016 / 17:57
0

Rodando no Cygwin, então não posso usar -A e -o, mas algo assim:

$ 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
    
por 23.05.2012 / 19:38
0

você pode fazer algo como

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

então xxx tem que ser o nome do processo e ele não irá pegar o grep por causa da âncora ^

    
por 23.05.2012 / 20:28

Tags