96 votes

Pourquoi "ps aux | grep x" donne-t-il de meilleurs résultats que "pgrep x" ?

Je viens d'essayer la commande suivante sur mon Ubuntu, elle ne montre rien :

pgrep php5

ne devrait-il pas retourner l'identifiant du processus de php5 (ce que fait la commande suivante) ?

ps aux | grep php5

Alors, quelle est la différence entre ces deux commandes ?

90voto

pellea72 Points 323

El ps aux | grep x donne de "meilleurs" résultats que la commande pgrep x essentiellement parce qu'il vous manque une option avec cette dernière.

Il suffit d'utiliser le -f option pour pgrep pour rechercher la ligne de commande complète et pas seulement le nom du processus, ce qui est son comportement par défaut, par exemple :

pgrep -f php5

Contrairement à la ps | grep avec laquelle vous devez filtrer les grep ligne ou utiliser des astuces de patronage, pgrep ne se ramasse pas d'elle-même.

De plus, si votre modèle apparaît dans ps USER vous obtiendrez des processus non désirés dans la sortie, pgrep ne souffre pas de ce défaut.

Si vous voulez des détails complets au lieu de seulement les pids, vous pouvez utiliser :

ps wup $(pgrep -f python)

qui est plus simple et plus fiable que

ps aux | grep python | grep -v grep

ou

ps aux | grep p[y]thon

88voto

ish Points 134738

ps aux inclut la ligne de commande complète (chemin et paramètres), tandis que pgrep ne regarde que la ligne de commande les 15 premiers caractères de les noms de l'exécutable

ps aux renvoie la ligne de commande complète de chaque processus, tandis que pgrep ne regarde que les noms des exécutables.

Cela signifie que grepping ps aux correspondra à tout ce qui se trouve dans le chemin ou les paramètres du binaire d'un processus : par exemple, `

  • ps aux | grep php5 correspondra à /usr/share/php5/i-am-a-perl-script.pl
  • mais pgrep php5 ne le fera pas

Prenons un exemple de mon système - mais nous utiliserons Python au lieu de php5 :

  • ps aux | grep python nous donne :

    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

  • Mais pgrep python retours uniquement 11729 que vous verrez dans la liste ci-dessus :

    root 11729 0.0 0.9 180508 19516 ? S Jun25 0:00 python /usr/lib/software-properties/software-properties-dbus

2voto

Thorsen Points 828
diff <(ps aux|grep x) <(pgrep x) # :)

1voto

Clay B. Points 11

En ce moment, ps donnera un résultat plus complet que pgep -f car pgrep est limité aux 4 096 premiers caractères (ce qui affecte souvent les utilisateurs de Java qui recherchent la classe d'entrée d'un programme Java avec un long classpath). Le bogue qui suit ce problème est le suivant : https://gitlab.com/procps-ng/procps/issues/86

0voto

jm_toball Points 141

Ce n'est peut-être pas mieux... quand j'ai essayé de chercher le processus du serveur tmux,

pgrep -l tmux

l'a montré, mais

ps aux | grep tmux 

ne le montre pas comme le serveur mais comme la commande qui a déclenché le démarrage du serveur. ( tmux new -s foo )

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X