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é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 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
- mais
pgrep php5
pas
Prenons 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
- Mais
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: Ppgrep
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 vouloirpgrep
à cela. L'utilisationps aux | grep xxx
n'est pas fiable, il est donc nécessaire que des outils informatiques se filtrentgrep
de la sortie et risquent de donner des faux positifs comme avecps aux | grep root
.La
ps aux | grep x
commande donne de "meilleurs" résultatspgrep x
qu'essentiellement car il vous manque une option avec cette dernière.Utilisez simplement l’
-f
option pourpgrep
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:Contrairement à la
ps | grep
construction avec laquelle vous devez filtrer lagrep
ligne ou utiliser des tours de modèle, vouspgrep
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:
qui est plus simple et plus fiable que
ou
la source
-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" lepgrep -a ruby
fera. Je ne sais pas si ce dernier peut être dupe aussi.pgrep
etps
.la source
À ce stade ,
ps
donnera une sortie plus complète quepgep -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/86la source