Respostas:
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áveisps 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
pgrep php5
nãoTomemos 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
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: P
pgrep
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 responsabilizado pgrep
por isso. O uso ps aux | grep xxx
não é confiável, portanto, é necessário que os hacks se filtrem grep
da saída e possam fornecer falsos positivos, como com ps aux | grep root
.
O ps aux | grep x
comando fornece resultados "melhores" do que pgrep x
essencialmente porque você está perdendo uma opção com o último.
Basta usar a -f
opção para pgrep
pesquisar a linha de comando completa e não apenas o nome do processo, que é o comportamento padrão, por exemplo:
pgrep -f php5
Ao contrário da ps | grep
construção com a qual você precisa filtrar a grep
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:
ps wup $(pgrep -f python)
que é mais simples e mais confiável do que
ps aux | grep python | grep -v grep
ou
ps aux | grep p[y]thon
-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
e ps
.
diff <(ps aux|grep x) <(pgrep x) # :)
No momento, ps
ele fornecerá uma saída mais completa do pgep -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/86