web-dev-qa-db-fra.com

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

Si vous appelez la commande top, vous obtenez tous les processus en cours. Mais comment puis-je limiter la sortie uniquement à un nom de processus tel que "Java"?

J'ai essayé ça top -l 2 | grep Java mais de cette manière, vous n’obtenez que des instantanés et non une liste constamment mise à jour. Et top -l 0 | grep Java n'est pas vraiment clair.

76
Alex

Je préfère ce qui suit pour pouvoir toujours utiliser top de manière interactive sans avoir à rechercher 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 réexécuter la commande.

Explication:

  • pgrep process-name retourne une liste d'identifiants de processus séparés par des nouvelles lignes
  • tr "\\n" "," traduit ces nouvelles lignes en virgules, car top veut une liste d'identifiants de processus séparés par des virgules.
  • sed est un éditeur de flux, et sed 's/,$//' est utilisé ici pour supprimer la virgule de fin.
127
Rick Byers

Recherchez les pids des processus à surveiller, puis utilisez l'option -p qui vous permet de fournir une liste de pids à 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 pense que vous pouvez également transmettre une liste séparée par des virgules.)

53
dogbane

que diriez-vous top -b | grep Java

31
Faisal Feroz

En développant @ dogbane's answer , vous pouvez obtenir tous les PID d'un processus nommé avec pgrep pour effectuer les opérations suivantes:

top -p "$(pgrep -d ',' Java)"
28
l0b0

Utilisez la commande watch

watch -d 'top -n1 | grep mysql'
6
tszming

Je l'exécute (par exemple): top -b | egrep -w 'Java|mysqld'

3
Alessandro Nizzo

En utilisant la réponse de ici j’ai pu créer un one liner

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
bcjenkins

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

top -n1 -b | grep "nom de procédure" 

dans ce cas: - n est utilisé pour définir combien de fois le processus
et -b sont utilisés pour montrer tous les pids 

cela empêche les erreurs telles que: top: pid limit (20) dépassé

2
Markomafs

Supposons .. si nous avons plus de 20 processus en cours d'exécution sur le serveur avec le même nom ... cela ne va pas aider 

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

Il essaiera de répertorier et de fournir en temps réel la sortie de 20 processus où nous avons de bonnes chances de rater d’autres processus qui consomme plus de ressources ....

Je cherche toujours une meilleure option sur ce 

1
user3482072

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
Ayyappa Boligala

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

0
Guru

En utilisant l'approche mentionnée dans la réponse de Rick Byers:

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

mais comme plus de 20 processus étaient en cours d'exécution, la commande suivante peut être utile pour une personne confrontée à une situation similaire.

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

pgrep obtient la liste des processus avec le nom donné - Java dans ce cas. head est utilisé pour obtenir les 20 premiers pids, car top ne peut pas gérer plus de 20 pids lors de l'utilisation de l'argument -p. Finalement, paste rejoint la liste des pids avec ','.

Vous pouvez contrôler le nom du processus que vous recherchez dans la commande ci-dessus et le nombre de processus portant ce nom que vous souhaitez surveiller. Vous pouvez ignorer la partie head -n 20 si le nombre de processus portant le même nom est inférieur à 20.

0
shaffooo

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

topfiltered() {
  [[ -z "$1" ]] && 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 || ($1 in pids)
    ' >"$dump"
  done
}

Je boucle en haut en mode connexion et le filtre avec awk, en construisant un tableau associatif à partir de la sortie de pgrep. Awk affiche les 12 premières lignes, où la ligne 12 correspond aux en-têtes de colonne, puis à chaque ligne comportant un pid correspondant à une clé du tableau. Le fichier de vidage est utilisé pour une boucle plus contrôlable.

0
aktivb

Un cas plus spécifique, comme je le recherchais en réalité: 

Pour les processus Java vous pouvez également utiliser jps -q jps est un outil de $ Java_HOME/bin et devrait donc figurer dans votre $ PATH.

0
Alex

Voici la solution only jusqu'à présent pour MacOS:

top -pid `pgrep Java | awk 'ORS=" -pid "' | sed 's/.\{6\}$//'`

cependant, invalid option or syntax: -pid sera signalé de manière non souhaitable s'il n'y a pas de processus Java en vie.

EXPLICATION

Les autres solutions publiées ici utilisent le format top -p id1,id2,id3, mais la variable top de MacOS ne prend en charge que le format non maniable top -pid id1 -pid id2 -pid id3.

Donc, premièrement, nous obtenons la liste des identifiants de processus qui ont pour nom de processus "Java":

pgrep Java

et nous transmettons ceci à awk qui joint les résultats avec le délimiteur " -pid "

| awk 'ORS=" -pid "'

Hélas, cela laisse un délimiteur de fuite! Par exemple, nous avons jusqu’à présent obtenu la chaîne "123 -pid 456 -pid 789 -pid ".

Nous utilisons ensuite simplement sed pour éliminer les 6 derniers caractères du délimiteur.

| sed 's/.\{6\}$//'`

Nous sommes prêts à transmettre les résultats à top:

top -pid `...`
0
Anti Earth