184 votes

Plus élégant "ps aux | grep -v grep"

Lorsque je vérifie la liste des processus et que j'extrais par grep ceux qui m'intéressent, la liste des processus est la suivante grep lui-même est également inclus dans les résultats. Par exemple, pour lister les terminaux :

$ ps aux  | grep terminal
user  2064  0.0  0.6 181452 26460 ?        Sl   Feb13   5:41 gnome-terminal --working-directory=..
user  2979  0.0  0.0   4192   796 pts/3    S+   11:07   0:00 grep --color=auto terminal

Normalement, j'utilise ps aux | grep something | grep -v grep pour se débarrasser de la dernière entrée... mais ce n'est pas élégant :)

Avez-vous un hack plus élégant pour résoudre ce problème (à part envelopper toutes les commandes dans un script séparé, ce qui n'est pas mal non plus).

4 votes

Pour ce que cela vaut, il s'agit d'une ancienne FAQ. Voir le point 3.10 à faqs.org/faqs/unix-faq/faq/part3

1 votes

Merci pour la référence. C'est leur méthode : ps ux | awk '/name/ && !/awk/ {print $2}'

0 votes

Quel est le grep -v grep partie en cours ?

288voto

Johnsyweb Points 45395

La technique habituelle est la suivante :

ps aux | egrep '[t]erminal'

Cela correspondra aux lignes contenant terminal qui egrep '[t]erminal' ne le fait pas ! Il fonctionne également sur beaucoup de saveurs d'Unix.

1 votes

Cela fonctionne pour moi pour une chaîne arbitraire, mais pas pour un nom d'utilisateur, par exemple. ps aux | grep '[r]oot' . Quelqu'un sait-il pourquoi ?

2 votes

@kxsong : | grep '[t]erminal' sélectionne toute ligne contenant le mot "terminal" sans placer le mot "terminal" dans la liste des processus. Qu'essayez-vous d'obtenir avec | grep '[r]oot' et comment cela ne fonctionne-t-il pas ? Il existe probablement une meilleure solution.

3 votes

Corrigez-moi si je me trompe, mais ceci devrait également fonctionner sur n'importe quelle position du caractère greffé : ps aux| grep "te[r]minal"

57voto

DarkDust Points 47584

Utilisez pgrep . Il est plus fiable.

0 votes

pgrep ne fonctionnera pas si je cherche par exemple à ps aux | grep 'ssh options'

12 votes

Jakub M. : Qu'en est-il pgrep -f ?

4 votes

@jakub-m Par défaut pgrep ne fait correspondre le motif qu'au nom du processus. Pour comparer l'ensemble de la commande, utilisez l'option -f drapeau.

29voto

A-B-B Points 797

Cette réponse s'appuie sur un précédent pgrep réponse . Elle s'appuie également sur une autre réponse en combinant l'utilisation de ps con pgrep . Voici quelques exemples de formation pertinents :

$ pgrep -lf sshd
1902 sshd

$ pgrep -f sshd
1902

$ ps up $(pgrep -f sshd)
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root      1902  0.0  0.1  82560  3580 ?        Ss   Oct20   0:00 /usr/sbin/sshd -D

$ ps up $(pgrep -f sshddd)
error: list of process IDs must follow p
[stderr output truncated]

$ ps up $(pgrep -f sshddd) 2>&-
[no output]

Ce qui précède peut être utilisé comme un fonction :

$ psgrep() { ps up $(pgrep -f $@) 2>&-; }

$ psgrep sshd
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root      1902  0.0  0.1  82560  3580 ?        Ss   Oct20   0:00 /usr/sbin/sshd -D

Comparez avec l'utilisation de ps con grep . La ligne d'en-tête utile n'est pas imprimée :

$  ps aux | grep [s]shd
root      1902  0.0  0.1  82560  3580 ?        Ss   Oct20   0:00 /usr/sbin/sshd -D

0 votes

Voir github.com/blueyed/oh-my-zsh/blob/ (mais c'est spécifique à Zsh).

0 votes

@blueyed, j'ai mis à jour la réponse avec la définition de la fonction bash.

0 votes

Note également -d pour spécifier un séparateur ; par ex. ps -fp$(pgrep -d , getty)

10voto

Andreas Frische Points 96

Vous pouvez filtrer dans la commande ps, par exemple

ps u -C gnome-terminal

(ou rechercher dans /proc avec trouver etc.)

6voto

TaXXoR Points 23

Un de plus alternative :

ps -fC terminal

Voici les options :

 -f        does full-format listing. This option can be combined
           with many other UNIX-style options to add additional
           columns. It also causes the command arguments to be
           printed. When used with -L, the NLWP (number of
           threads) and LWP (thread ID) columns will be added. See
           the c option, the format keyword args, and the format
           keyword comm.

 -C cmdlist     Select by command name.
                This selects the processes whose executable name is
                given in cmdlist.

6 votes

Un inconvénient mineur, et qui n'est pas vraiment lié à la question de l'OP, est que cela ne vous montrera pas des choses comme Tomcat, qui est en fait exécuté comme java avec une liste d'arguments.

0 votes

-C Cette option a déjà été suggérée dans la réponse de @Andreas Frishe postée plus d'un an et demi auparavant

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X