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

71

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

pgrep php5

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

ps aux | grep php5

Quelle est la différence entre ces deux commandes?

    
posée xczzhh 28.06.2012 - 11:43
la source

3 réponses

62

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, tandis que pgrep ne regarde que les noms des exécutables.

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

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

Prenons un exemple de mon système - nous utiliserons uniquement 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 renvoie uniquement 11729 , ce 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
    
réponse donnée ish 28.06.2012 - 12:00
la source
68

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

Utilisez simplement l’option -f pour que pgrep recherche la ligne de commande complète et pas seulement le nom du processus qui est son comportement par défaut, par exemple:

pgrep -f php5

Contrairement à la construction ps | grep avec laquelle vous devez filtrer la ligne grep ou utiliser des astuces de motif, pgrep ne se contente pas de se définir par sa conception.

De plus, si votre modèle apparaît dans la colonne ps USER , vous obtiendrez des processus indésirables dans la sortie, pgrep ne souffre pas de cette faille.

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

ps wup $(pgrep -f python)

plus simple et plus fiable que

ps aux | grep python | grep -v grep

ou

ps aux | grep p[y]thon
    
réponse donnée jlliagre 09.09.2012 - 10:37
la source
1
diff <(ps aux|grep x) <(pgrep x) # :)
    
réponse donnée Thorsen 28.06.2012 - 12:09
la source

Lire d'autres questions sur les étiquettes