Limiter la sortie de la commande supérieure à un nom de processus spécifique

si vous appelez la commande supérieure, vous obtenez tous les processus en cours d'exécution. Mais comment puis-je limiter la sortie seulement à un certain nom de processus comme "java ?

j'ai essayé ceci top-l 2 / grep java mais de cette façon, vous obtenez seulement des instantanés et pas une liste continuellement mise à jour. Et top-l 0 / grep java n'est pas vraiment clair.

76
demandé sur animuson 2010-09-16 18:42:54

15 réponses

je préfère ce qui suit donc je peux toujours utiliser top de façon interactive sans avoir à chercher les pids chaque fois que je l'exécute:

top -p `pgrep process-name | tr "\n" "," | sed 's/,$//'`

bien sûr, si les processus changent, vous devrez relancer la commande.

explication:

  • pgrep process-name retourne une liste d'identificateurs de processus qui sont séparés par de nouvelles lignes
  • tr "\n" "," traduit ces nouvelles lignes en virgules, parce que top veut un liste des codes de processus séparés par des virgules
  • sed est un éditeur de flux, et sed 's/,$//' est utilisé ici pour supprimer la virgule
127
répondu Rick Byers 2015-06-11 13:01:45

Trouvez les pid des processus que vous voulez surveiller, puis utilisez l'option -p qui vous permet de fournir une liste de PID à la commande top .

exemple:

top -p 18884 -p 18892 -p 18919

  PID USER     PRI  NI  SIZE  RSS SHARE STAT %CPU %MEM   TIME CPU COMMAND
18884 user  25   0  672M  95M  9476 S     0.0  1.1   0:02   1 java
18892 user  25   0 2280M 123M 12252 S     0.0  1.5   0:05   1 java
18919 user  22   0 1492M 198M 28708 S     0.0  2.4   0:07   1 java

(je crois que vous pouvez aussi passer dans une liste séparée par des virgules.)

53
répondu dogbane 2010-09-16 15:25:02

Que diriez-vous de top-b | grep java

31
répondu Faisal Feroz 2010-09-16 14:48:54

en développant sur la réponse de @dogbane , vous pouvez obtenir tous les PID pour un processus nommé avec pgrep pour faire ce qui suit:

top -p "$(pgrep -d ',' java)"
27
répondu l0b0 2017-05-23 12:02:57

Utiliser le regarder commande

watch -d 'top -n1 | grep mysql'
6
répondu tszming 2010-09-16 14:58:18

je l'exécuter (par exemple.): top -b | egrep -w 'java|mysqld'

3
répondu Alessandro Nizzo 2015-09-01 13:00:40

en utilisant la réponse de ici j'ai pu créer une doublure

top -pid $(pgrep process_name | sed -e ':a' -e 'N' -e '$!ba' -e 's/\n/ -pid /g')

Cela fonctionne pour moi sur MacOS 10.12 (Sierra)

3
répondu bcjenkins 2017-05-23 12:18:28

j'ai résolu mon problème en utilisant:

top -n1-b | grep "proccess name"

dans ce cas: -n est utilisé pour définir combien de fois sera supérieur ce que proccess

et-b est utilisé pour afficher tous les pid

il prévient les erreurs comme : top: limite pid (20) dépassée

2
répondu Markomafs 2014-02-25 19:06:51

le code suivant met à jour une liste de processus toutes les 5 secondes via la commande watch:

watch -n 5 -t top -b -n 1 -p$(pgrep java | head -20 | tr "\n" "," | sed 's/,$//')

2
répondu gnod 2014-06-18 14:08:19

Suppose .. si nous avons plus de 20 processus tournant sur le serveur avec le même nom ... cela n'aidera pas

haut -p pgrep oracle | head -n 20 | tr "\n" "," | sed 's/,$//'

il va essayer d'énumérer et de fournir la production en temps réel de 20 processus où nous avons de bonnes chances de manquer d'autres prcesses qui consomme plus de ressources ....

je suis toujours à la recherche d'une meilleure option sur ce

1
répondu user3482072 2014-03-31 17:09:01

un cas plus spécifique, comme je le cherchais en fait:

pour processus Java vous pouvez également utiliser jps -q par lequel jps est un outil de $JAVA_HOME/bin et donc devrait être dans votre $PATH.

0
répondu Alex 2014-05-20 07:10:14

je suis venu chercher la réponse sur OSX. J'ai fini par obtenir ce que je voulais avec bash et awk:

topfiltered() {
  [[ -z "" ]] && return
  dump="/tmp/top_dump"
  rm -f "$dump"
  while :; do
    clear
    [[ -s "$dump" ]] && head -n $(( $LINES - 1 )) "$dump"
    top -l 1 -o cpu -ncols $(( $COLUMNS / 8 )) | awk -v p="$(pgrep -d ' ' $@)" '
        BEGIN { split(p, arr); for (k in arr) pids[arr[k]]=1 }
        NR<=12 || ( in pids)
    ' >"$dump"
  done
}

je boucle top en mode logging et le filtre avec awk, en construisant un tableau associatif à partir de la sortie de pgrep. Awk imprime les 12 premières lignes, où la ligne 12 est les en-têtes de colonne, et ensuite chaque ligne qui a un pid qui est une clé dans le tableau. Le fichier dump est utilisé pour une boucle plus observable.

0
répondu aktivb 2014-09-19 18:12:40

juste top -bn 1 | grep java fera l'affaire pour vous

0
répondu Guru 2014-12-08 09:38:05

L'exécution de ce qui suit donnera une mise à jour continue dans la console:

bcsmc2rtese001 [~]$ echo $SHELL  
/bin/bash  
bcsmc2rtese001 [~]$ top | grep efare  or watch -d 'top | grep efare' or top -p pid
27728 efare     15   0 75184 3180 1124 S  0.3  0.0 728:28.93 tclsh  
27728 efare     15   0 75184 3180 1124 S  0.7  0.0 728:28.95 tclsh
0
répondu Ayyappa Boligala 2017-01-12 10:02:09

à l'Aide de l'approche mentionné dans la réponse de Rick Byers:

top -p `pgrep java | paste -sd "," -`

mais j'ai eu plus de 20 processus en cours donc suivre la commande peut être utile pour quelqu'un qui rencontre une situation similaire.

top -p `pgrep java | head -n 20 | paste -sd "," -`

pgrep obtient la liste des processus avec un nom donné - java dans ce cas. head est utilisé pour obtenir les 20 premiers pids parce que top ne peut pas gérer plus de 20 pids en utilisant l'argument-p. Enfin paste rejoint la liste des pid avec des ','.

Vous pouvez contrôler le nom du processus que vous cherchez dans la commande ci-dessus et le nombre de processus avec le nom que vous êtes intéressé à regarder. Vous pouvez ignorer la partie head -n 20 si le nombre de vos processus avec le prénom est inférieur à 20.

0
répondu shaffooo 2018-01-30 19:34:17