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


149
top -c

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

Par exemple, je voudrais que l'option top -some -substring of processname et top affiche les pids n'ayant que cette sous-chaîne dans son nom de commande

Réponses:


214

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

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

top -pattend une liste de pids séparés par des virgules donc nous utilisons -d','dans pgrep. L' -findicateur dans pgrep le fait correspondre à la ligne de commande au lieu du nom du programme.


12
rappelez-vous simplement que si de nouveaux processus sont générés pour 'string_to_match_in_cmd_line', ils n'apparaîtront pas en haut; vous devrez quitter top et relancer cette commande
eugenevd

1
Comme l'a dit eugenevd, cela ne fonctionnera pas pour les nouveaux processus démarrés après l'appel du top. Y a-t-il moyen de le faire? J'ai besoin d'exécuter plusieurs programmes avec le même préfixe sur son nom, et j'aimerais voir combien d'entre eux fonctionnent en direct, sans avoir besoin d'exécuter un nouveau top (ou juste un ps) à chaque fois.
Jester

1
@Jester, eugenevd, j'ai eu le même problème que vous. J'ai créé une nouvelle version sur stackoverflow.com/a/27653841/681830 , j'espère que cela vous aidera.
Val

5
Je rencontrai top: pid limit (20) exceededdonc je ceci: top -c -p $(pgrep -f string_to_match_in_cmd_line | head -20 | tr "\\n" "," | sed 's/,$//').
f01 du

115

Cela peut être fait de manière interactive

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

Si vous voulez juste une sortie de base, cela pourrait suffire:

top -bc |grep name_of_process

7
Cela me donne 'option ou syntaxe invalide: -bc'
shmim

3
top -bc -n 1 est plus pratique, car il limite le nombre d'itérations à 1.
galath

1
Cela devrait être la réponse acceptée. C'est plus précis et fonctionne uniquement avec les options fournies par la commande «top». Et cela montre de nouveaux processus.
Abraham TS

Les processus continuent de disparaître et de réapparaître avec top -c , hit o and write a filter on a column.
MrR

92

Vous pouvez ajouter des filtres toppendant son exécution, appuyez simplement sur la otouche, puis saisissez une expression de filtre. Par exemple, pour surveiller tous les processus java, utilisez l'expression de filtre COMMAND=java. Vous pouvez ajouter plusieurs filtres en appuyant à nouveau sur la touche, vous pouvez filtrer par utilisateur avec la utouche et vous pouvez effacer tous les filtres avec la =touche.


2
C'est une meilleure solution que la réponse acceptée (cette solution s'est posée 3 ans plus tard que l'original). Contrairement à l'original, cette solution fonctionne également sur les processus nouvellement créés. Très important si vous surveillez des processus Apache créés à la demande.
Nate Lampton

2
En effet une meilleure solution car elle filtre en direct. La solution acceptée résout les identifiants de processus avant d'exécuter top. Le processus résultant est comme celui top -c -p 920,1345,1346qui est fixe.
Jérôme Gillard

4
L'utilisation ocomme filtre n'existe pas dans certaines versions (plus anciennes) de top: top: procps version 3.2.8le filtre utilisateur existe, donc cela fonctionne.
Manwe

13

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

exemple: filtre en haut pour n'afficher que l'application appelée yakuake:

$ pgrep yakuake
1755

$ top -p 1755

commandes interactives supérieures utiles 'c': basculer le chemin complet contre le nom de la commande 'k': tuer par PID 'F': filtrer par ... sélectionner avec des flèches ... puis appuyer sur 's' pour définir le tri

la réponse ci-dessous est bonne aussi ... Je cherchais cela aujourd'hui mais je ne l'ai pas trouvé. Merci


7

Après avoir cherché autant de réponses sur StackOverflow, je n'ai pas vu de réponse correspondant à mes besoins.

Autrement dit, pour que la commande top continue de se rafraîchir avec un mot-clé donné, et nous n'avons pas à CTRL + C / top encore et encore lorsque de nouveaux processus apparaissent.

Ainsi j'en fais un nouveau ...

Voici la version sans redémarrage nécessaire.

__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 de la charge de travail système est manquante avec le code ci-dessus. Pour les personnes soucieuses de 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;)

il manque un aperçu de la charge de travail du système. ajouter "uptime" avant de dormir, pour les listes de processus courts, cela suffit à mon humble avis.
Sevyls

1
@Sevyls Merci de l'avoir signalé! Après quelques tentatives (qui ne fonctionnent pas aussi bien que), votre version pourrait être l'une des meilleures. Réponse modifiée.
Val

Fonctionne très bien si j'ai un ou plusieurs processus en cours d'exécution qui correspondent mais j'obtiens un "top: utilisateur invalide" quand tout s'arrête. Il récupère quand un autre processus démarre. Je cours sur Raspbian FYI. Merci.
Mike

1

Et ça?

top -c -p <PID>

4
nous essayons de filtrer par nom de processus (ou sa sous-chaîne) et lorsque vous redémarrez votre processus, vous obtiendrez un nouveau pid.
Srujan Kumar Gulla

1

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

1

La plupart des réponses échouent ici, lorsque la liste des processus dépasse 20 processus. C'est la top -plimite des options. Pour ceux dont le haut est plus ancien qui ne prend pas en charge le filtrage avec ooptions, voici un exemple scriptable pour obtenir une sortie plein écran / console (les informations récapitulatives sont absentes de 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

Dans htop, vous pouvez simplement rechercher avec

/process-name
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.