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.
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 lignestr "\\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.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.)
que diriez-vous top -b | grep Java
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)"
Utilisez la commande watch
watch -d 'top -n1 | grep mysql'
Je l'exécute (par exemple): top -b | egrep -w 'Java|mysqld'
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)
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é
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
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
top -bn 1 | grep Java
fera l'affaire pour vous
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.
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.
Un cas plus spécifique, comme je le recherchais en réalité:
Pour les processus Java vous pouvez également utiliser jps -q
où jps est un outil de $ Java_HOME/bin et devrait donc figurer dans votre $ PATH.
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 `...`