Por que “ps aux | grep x ”dá melhores resultados que“ pgrep x ”?

69

Acabei de experimentar o seguinte comando no meu Ubuntu, não mostra nada:

pgrep php5

não deve retornar o id do processo do php5 (que o seguinte comando apenas faz)?:

ps aux | grep php5

Então, qual é a diferença entre esses dois comandos?

    
por xczzhh 28.06.2012 / 11:43

3 respostas

61

ps aux inclui a linha de comando completa (caminho e parâmetros), enquanto o pgrep examina apenas os primeiros 15 caracteres dos nomes dos executáveis

ps aux retorna a linha de comando completa de cada processo, enquanto pgrep apenas analisa os nomes dos executáveis.

Isso significa que grepping ps aux output corresponderá a qualquer coisa que ocorra no caminho ou nos parâmetros de um processo 'binário: por exemplo, '

  • ps aux | grep php5 corresponderá a /usr/share/php5/i-am-a-perl-script.pl
  • mas pgrep php5 não

Tome um exemplo do meu sistema - somente usaremos python em vez de php5 :

  • ps aux | grep python nos dá:
izx       2348  0.0  0.7 514928 15644 ?        Sl   Jun24   0:00 /usr/bin/python /usr/lib/unity-lens-video/unity-lens-video
izx       2444  0.0  0.9 547392 18864 ?        Sl   Jun24   0:01 /usr/bin/python /usr/lib/unity-scope-video-remote/unity-scope-video-remote
root      2805  0.0  0.5  95436 12204 ?        S    Jun24   0:00 /usr/bin/python /usr/lib/system-service/system-service-d
izx       6272  0.0  2.9 664400 60320 ?        SNl  Jun24   1:16 /usr/bin/python /usr/bin/update-manager --no-focus-on-map
root     11729  0.0  0.9 180508 19516 ?        S    Jun25   0:00 python /usr/lib/software-properties/software-properties-dbus
  • Mas pgrep python retorna apenas 11729 , o que você verá na lista acima é:
root     11729  0.0  0.9 180508 19516 ?        S    Jun25   0:00 python /usr/lib/software-properties/software-properties-dbus
    
por ish 28.06.2012 / 12:00
65

O comando ps aux | grep x dá resultados "melhores" do que pgrep x essencialmente porque você está perdendo uma opção com o último.

Basta usar a opção -f para pgrep para pesquisar a linha de comando completa e não apenas o nome do processo que é seu comportamento padrão, por exemplo:

pgrep -f php5

Ao contrário da construção ps | grep com a qual você precisa filtrar a linha grep ou usar truques de padrão, pgrep não se ajustará sozinho por design.

Além disso, caso seu padrão apareça na coluna ps USER , você obterá processos indesejados na saída, pgrep não sofrerá com essa falha.

Se você quiser detalhes completos em vez de apenas os pids, use:

ps wup $(pgrep -f python)

que é mais simples e confiável do que

ps aux | grep python | grep -v grep

ou

ps aux | grep p[y]thon
    
por jlliagre 09.09.2012 / 10:37
1
diff <(ps aux|grep x) <(pgrep x) # :)
    
por Thorsen 28.06.2012 / 12:09