Réponses:
ps aux
inclut 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 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 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.pl
pgrep php5
pasPrenons 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 python
renvoie 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>/stat
mais pas à partir/proc/<pid>/cmdline
. OK, @Thorsen, vous gagnez le bogue, c'est un bogue: P
pgrep
n'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 xxx
n'est pas fiable, il est donc nécessaire que des outils informatiques se filtrent grep
de la sortie et risquent de donner des faux positifs comme avec ps aux | grep root
.
La ps aux | grep x
commande donne de "meilleurs" résultats pgrep x
qu'essentiellement car il vous manque une option avec cette dernière.
Utilisez simplement l’ -f
option pour pgrep
rechercher 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 | grep
construction avec laquelle vous devez filtrer la grep
ligne ou utiliser des tours de modèle, vous pgrep
ne vous choisissez pas tout seul.
De plus, si votre modèle apparaît dans la ps
USER
colonne, vous obtiendrez des processus indésirables dans la sortie, pgrep
sans 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
.)
pgrep
de jouer la bonne solution. +1
/proc/self/cmdline
pour être "descriptifs", pgrep -fa ruby
ils ne correspondent pas, par exemple. puma 3.3.0 (tcp://localhost:3000) [MIQ: Web Server Worker]
tandis que le "bête" le pgrep -a ruby
fera. Je ne sais pas si ce dernier peut être dupe aussi.
pgrep
et ps
.
diff <(ps aux|grep x) <(pgrep x) # :)
À ce stade , ps
donnera une sortie plus complète que pgep -f
pgrep 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