web-dev-qa-db-fra.com

commande top -c sous linux pour filtrer les processus répertoriés en fonction du nom du processus

top -c

Top répertorie tous les processus. Il existe de bonnes options pour filtrer les processus par nom d'utilisateur à l'aide de l'option -u, mais je me demande s'il existe un moyen simple de filtrer les processus en fonction du nom de processus indiqué dans la colonne COMMAND de la sortie supérieure.

Par exemple, je voudrais comme option top -some une -substring de nomprocessus et top affiche pids seulement ayant cette sous-chaîne dans son nom de commande

112
user1615330

Utiliser pgrep pour obtenir les pid des lignes de commande correspondantes:

top -c -p $(pgrep -d',' -f string_to_match_in_cmd_line)

top -p attend une liste de pids séparés par des virgules, nous utilisons donc -d',' dans pgrep. L'indicateur -f dans pgrep lui fait correspondre la ligne de commande au lieu du nom du programme.

173
perreal

Cela peut être fait de manière interactive

Après avoir exécuté top -c, appuyez sur o et écrivez un filtre sur une colonne, par ex. pour afficher les lignes où la colonne COMMAND contient la chaîne foo, écrivez COMMAND=foo

Si vous voulez juste une sortie basique, cela pourrait suffire:

top -bc |grep name_of_process
94
nos

Vous pouvez ajouter des filtres à top pendant son exécution. Appuyez simplement sur la touche o clé puis tapez une expression de filtre. Par exemple, pour contrôler tous les processus Java, utilisez l'expression de filtre COMMAND=Java. Vous pouvez ajouter plusieurs filtres en appuyant de nouveau sur la touche. Vous pouvez filtrer par utilisateur avec u clé, et vous pouvez effacer tous les filtres avec le = clé.

64
Don Kirkby

La commande de @ perreal fonctionne très bien! Si vous oubliez, essayez en deux étapes ...

exemple: top top pour afficher uniquement l'application appelée yakuake:

$ pgrep yakuake
1755

$ top -p 1755

commandes interactives supérieures utiles 'c': bascule le chemin complet en fonction du nom de la commande 'k': tuer par PID 'F': filtrez par ... sélectionnez avec les flèches ... puis appuyez sur 's' pour définir le tri

la réponse ci-dessous est bonne aussi ... Je le cherchais aujourd'hui, mais je ne le trouvais pas. Merci

11
BBW Before Windows

Après avoir cherché autant de réponses sur StackOverflow, je n’ai pas trouvé de réponse adaptée à mes besoins.

Autrement dit, l'activation de la commande top continue d'actualiser le mot clé indiqué. Nous n'avons pas besoin de CTRL + C/top encore et encore lorsque de nouveaux processus apparaissent.

Donc j'en fais un nouveau ...

Voici la version sans besoin de redémarrage.

__keyword=name_of_process; (while :; do __arg=$(pgrep -d',' -f $__keyword); if [ -z "$__arg" ]; then top -u 65536 -n 1; else top -c -n 1 -p $__arg; fi; sleep 1; done;)

Modifiez le __keyword et cela devrait fonctionner. (Ubuntu 2.6.38 testé)

2.14.2015 ajouté: La partie charge de travail système est manquante avec le code ci-dessus . Pour les personnes intéressées par la partie "charge moyenne":

__keyword=name_of_process; (while :; do __arg=$(pgrep -d',' -f $__keyword); if [ -z "$__arg" ]; then top -u 65536 -n 1; else top -c -n 1 -p $__arg; fi; uptime; sleep 1; done;)
7
Val

La plupart des réponses échouent ici lorsque la liste de processus dépasse 20 processus. Il s’agit de top -p option limit . Pour ceux dont l’ancien est supérieur et qui ne prennent pas en charge le filtrage avec les options o, voici un exemple de script permettant d’obtenir une sortie plein écran/console (des informations de résumé manquent dans cette sortie).

__keyword="YOUR_FILTER" ; ( FILL=""; for i in  $( seq 1 $(stty size|cut -f1 -d" ")); do FILL=$'\n'$FILL; done ;  while :; do HSIZE=$(( $(stty size|cut -f1 -d" ")  - 1 ));  (top -bcn1 | grep "$__keyword"; echo "$FILL" )|head -n$HSIZE; sleep 1;done )

Quelques explications

__keyword = your grep filter keyword
HSIZE=console height
FILL=new lines to fill the screen if list is shorter than console height
top -bcn1 = batch, full commandline, repeat once
1
Manwe

et ça?

top -c -p <PID>
1
Satish

J'ai fini par utiliser un script Shell avec le code suivant:

#!/bin/bash

while [ 1 == 1 ]
do
    clear
    ps auxf |grep -ve "grep" |grep -E "MSG[^\ ]*" --color=auto
    sleep 5
done
0
Jester