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.
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, etsed 's/,$//'
est utilisé ici pour supprimer la virgule
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.)
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)"
je l'exécuter (par exemple.): top -b | egrep -w 'java|mysqld'
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
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/,$//')
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
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.
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.
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
à 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.