Question Pourquoi «ps aux | grep x ”donne 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 retourner l'identifiant 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?


72
2018-06-28 09:43


origine




Réponses:


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

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

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

  • ps aux | grep php5 va correspondre /usr/share/php5/i-am-a-perl-script.pl
  • mais pgrep php5 habitude

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 / lens-video-unit / video-lens-unit
izx 2444 0.0 0.9 547392 18864? Sl Jun24 0:01 / usr / bin /python / usr / lib / unit-scope-video-remote / unit-scope-video-remote
racine 2805 0,0 0,5 95436 12204? S 24 juin 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
racine 11729 0.0 0.9 180508 19516? S juin25 0:00 python / usr / lib / propriétés-software / propriétés-software-dbus
  • Mais pgrep python ne retourne que 11729, que vous verrez dans la liste ci-dessus est:
racine 11729 0.0 0.9 180508 19516? S juin25 0:00 python / usr / lib / propriétés-software / propriétés-software-dbus

62
2018-06-28 10:00



"pgrep -l" tronque également le processus à 15 caractères, ce qui est probablement un bogue mais a été comme ça pendant des siècles - Thorsen
Eh bien, il est dans le tableau de bord en tant que bogue en amont à partir de 2008 :) "commande top et ps truncate après 15 caractères" bugs.launchpad.net/ubuntu/+source/procps/+bug/295876 - Thorsen
Hah, cela explique, du commentaire n ° 3: Ceci est dû au fait que certaines procédures de procs reçoivent le nom de la commande de /proc/<pid>/stat mais pas de /proc/<pid>/cmdline. OK, @Thorsen, vous gagnez le bug spray, c'est un bug: P - ish
Merci beaucoup. Selon votre réponse, pgrep est une commande tout à fait déraisonnable, car elle pourrait bien ignorer tout le processus en cours dans certaines circonstances (par exemple, mon php5). Y a-t-il une autre raison convaincante pour que cette commande existe? - xczzhh
@xczzhh pgrep n'est pas une commande déraisonnable. Cela fonctionne bien et comme prévu. Le problème est simplement que vous manquiez une option lorsque vous l'exécutez, vous ne pouvez pas blâmer pgrep pour ça. En utilisant ps aux | grep xxx n'est pas fiable, donc besoin de hacks pour filtrer grep lui-même de la sortie et pourrait donner des faux positifs comme avec ps aux | grep root. - jlliagre


le ps aux | grep x commande donne de "meilleurs" résultats que pgrep x essentiellement parce que vous manquez une option avec ce dernier.

Utilisez simplement le -f option pour pgrep pour rechercher 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 au ps | grep construction avec laquelle vous devez filtrer le grep ligne ou utiliser des astuces de motif, pgrep ne veut tout simplement pas se choisir par conception.

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

Si vous voulez plus de détails au lieu de simplement 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

70
2017-09-09 08:37



Ajoutez également le -a (--list-full) option si vous voulez voir la ligne de commande complète et pas seulement le pid. (Ancien pgrep n'avait pas -a, a fait ça sur -fl.) - Beni Cherniavsky-Paskin
La question initiale portait sur la différence, mais cela donne en fait à ceux d’entre nous pgrep jouer gentiment la solution. +1 - 2rs2ts
@ 2rs2ts Merci, il me manquait en effet pour répondre à la question posée. Correction maintenant - jlliagre
Dans certains cas, lorsque les programmes modifient /proc/self/cmdline être "descriptif", pgrep -fa ruby ne correspondra pas, par exemple. puma 3.3.0 (tcp://localhost:3000) [MIQ: Web Server Worker], tandis que le "plus bête" pgrep -a ruby volonté. Pas sûr si ce dernier peut être dupe aussi. - Beni Cherniavsky-Paskin
@ BeniCherniavsky-Paskin Je suppose que cela aurait pu être un commentaire à la question, car il s'applique à la fois pgrep et ps. - Franklin Yu


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

1
2018-06-28 10:09



Cela peut répondre à la question posée - mais vous pouvez peut-être élargir votre réponse pour expliquer ce que fait cette commande à une ligne. - fossfreedom♦