ps aux
inclui a linha de comando completa (caminho e parâmetros), enquanto o pgrep olha apenas os 15 primeiros caracteres dos nomes dos executáveis
ps aux
retorna a linha de comando completa de cada processo, enquanto pgrep
olha apenas os nomes dos executáveis.
Isso significa que a saída grepping ps aux
corresponderá a qualquer coisa que ocorra no caminho ou nos parâmetros do binário de um processo: por exemplo, `
ps aux | grep php5
vai combinar /usr/share/php5/i-am-a-perl-script.pl
- mas
pgrep php5
não
Tomemos 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
raiz 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
raiz 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
, que você verá na lista acima é:
raiz 11729 0,0 0,9 180508 19516? S Jun25 0:00 python / usr / lib / software-properties / software-properties-dbus
/proc/<pid>/stat
mas não de/proc/<pid>/cmdline
. OK, @Thorsen, você ganha o repelente de insetos, é um inseto: Ppgrep
não é um comando irracional. Funciona bem e como projetado. O problema é simplesmente você estava perdendo uma opção quando a executava, não pode ser responsabilizadopgrep
por isso. O usops aux | grep xxx
não é confiável, portanto, é necessário que os hacks se filtremgrep
da saída e possam fornecer falsos positivos, como comps aux | grep root
.O
ps aux | grep x
comando fornece resultados "melhores" do quepgrep x
essencialmente porque você está perdendo uma opção com o último.Basta usar a
-f
opção parapgrep
pesquisar a linha de comando completa e não apenas o nome do processo, que é o comportamento padrão, por exemplo:Ao contrário da
ps | grep
construção com a qual você precisa filtrar agrep
linha ou usar truques de padrão,pgrep
simplesmente não se escolhe por design.Além disso, se seu padrão aparecer na
ps
USER
coluna, 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, pode usar:
que é mais simples e mais confiável do que
ou
fonte
-a
(--list-full
) se quiser ver a linha de comando completa e não apenas o pid. (Pgrep Older não tinha-a
, fiz isso em-fl
.)pgrep
jogar bem a solução. 1/proc/self/cmdline
para serem "descritivos",pgrep -fa ruby
não coincidem, por exemplo.puma 3.3.0 (tcp://localhost:3000) [MIQ: Web Server Worker]
, enquanto o "mais burro"pgrep -a ruby
será. Não tenho certeza se o último também pode ser enganado.pgrep
eps
.fonte
No momento,
ps
ele fornecerá uma saída mais completa dopgep -f
que o pgrep limitado aos 4.096 caracteres (geralmente afetando os usuários Java que procuram a classe de entrada de um programa Java com um longo caminho de classe). O bug que rastreia isso é: https://gitlab.com/procps-ng/procps/issues/86fonte