web-dev-qa-db-fra.com

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, cela ne montre rien:

pgrep php5

ne devrait-il pas renvoyer l'ID de processus de php5 (que la commande suivante ne fait que)?

ps aux | grep php5

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

79
xczzhh

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

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

Cela signifie que grepping ps aux correspond à tout ce qui se produit dans le chemin ou dans les paramètres d'un processus 'binaire: par ex. `

  • 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. Nous utiliserons seulement 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 juin24 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 juin 25 0:00 python /usr/lib/software-properties/software-properties-dbus
  • Mais pgrep python ne renvoie que 11729, ce que vous verrez dans la liste ci-dessus est:
racine 11729 0,0 0,9 180508 19516? S juin 25 0:00 python / usr/lib/software-properties/software-properties-dbus
72
ish

La commande ps aux | grep x donne de "meilleurs" résultats que pgrep x essentiellement parce qu'il vous manque une option avec ce dernier.

Utilisez simplement l’option -f pour pgreppour effectuer une recherche dans la ligne de commande complète et pas uniquement dans le nom du processus qui correspond à son comportement par défaut, par exemple:

pgrep -f php5

Contrairement à la construction ps | grep avec laquelle vous devez filtrer la ligne grepou utiliser des tours de modèle, pgrepne se choisira pas tout seul.

De plus, si votre modèle apparaît dans la colonne psUSERname__, vous obtiendrez des processus indésirables dans la sortie, pgrepne souffrira pas de cette faille.

Si vous voulez des détails complets au lieu des 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
77
jlliagre
diff <(ps aux|grep x) <(pgrep x) # :)
3
Thorsen