Réponses:
ps auxinclut la ligne de commande complète (chemin et paramètres), tandis que pgrep ne regarde que les 15 premiers caractères du nom de l'exécutableps auxrenvoie la ligne de commande complète de chaque processus, alors que pgrepne regarde que les noms des exécutables.
Cela signifie que la sortie de greps ps aux correspondra à tout ce qui se produit dans le chemin ou dans les paramètres d'un processus 'binaire: par exemple `
ps aux | grep php5 correspondra /usr/share/php5/i-am-a-perl-script.plpgrep php5pasPrenons un exemple de mon système - seulement nous allons utiliser python à la place 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 / unité-objectif-vidéo / unité-objectif-vidéo 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 racine 2805 0,0 0,5 95436 12204? S juin24 0:00 / usr / bin / python / usr / lib / service-système / système-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? Juin 25 0:00 python / usr / lib / logiciels-propriétés / logiciels-propriétés-dbus
pgrep pythonrenvoie uniquement 11729, ce que vous verrez dans la liste ci-dessus est:racine 11729 0,0 0,9 180508 19516? Juin 25 0:00 python / usr / lib / logiciels-propriétés / logiciels-propriétés-dbus
/proc/<pid>/statmais pas à partir/proc/<pid>/cmdline . OK, @Thorsen, vous gagnez le bogue, c'est un bogue: P
pgrepn'est pas une commande déraisonnable. Cela fonctionne bien et comme prévu. Le problème est simplement qu'il vous manquait une option lorsque vous l'exécutez, vous ne pouvez pas en vouloir pgrepà cela. L'utilisation ps aux | grep xxxn'est pas fiable, il est donc nécessaire que des outils informatiques se filtrent grepde la sortie et risquent de donner des faux positifs comme avec ps aux | grep root.
La ps aux | grep xcommande donne de "meilleurs" résultats pgrep xqu'essentiellement car il vous manque une option avec cette dernière.
Utilisez simplement l’ -foption pour pgreprechercher dans la ligne de commande complète et pas uniquement dans le nom du processus qui est son comportement par défaut, par exemple:
pgrep -f php5
Contrairement à la ps | grepconstruction avec laquelle vous devez filtrer la grepligne ou utiliser des tours de modèle, vous pgrepne vous choisissez pas tout seul.
De plus, si votre modèle apparaît dans la ps USERcolonne, vous obtiendrez des processus indésirables dans la sortie, pgrepsans souffrir 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
-a( --list-full) si vous voulez voir la ligne de commande complète et pas seulement le pid. (Plus ancien pgrep n'avait pas -a, a fait cela-fl .)
pgrepde jouer la bonne solution. +1
/proc/self/cmdlinepour être "descriptifs", pgrep -fa rubyils ne correspondent pas, par exemple. puma 3.3.0 (tcp://localhost:3000) [MIQ: Web Server Worker]tandis que le "bête" le pgrep -a rubyfera. Je ne sais pas si ce dernier peut être dupe aussi.
pgrepet ps.
diff <(ps aux|grep x) <(pgrep x) # :)
À ce stade , psdonnera une sortie plus complète que pgep -fpgrep est limité aux 4 096 caractères (affectant souvent les utilisateurs Java à la recherche de la classe d’entrée d’un programme Java avec un long chemin de classes). Le suivi des bogues est le suivant: https://gitlab.com/procps-ng/procps/issues/86