91 votes

La commande Linux "Top" pour Windows Powershell?

Je recherche une commande PowerShell qui peut offrir une fonctionnalité similaire à l'application Linux Top. Quelque chose qui se rafraîchit à un intervalle donné et affiche la liste des processus avec utilisation CPU %.

J'ai vu des scripts qui listent l'utilisation de CPU % dans une boucle mais quelque chose comme top serait beaucoup plus pratique car nous avons configuré un accès SSH/Powershell pour la gestion (je préfère toujours un shell Putty!)

0 votes

Cela tombe clairement dans la catégorie des questions superuser.com.

0 votes

Cool - Je ne savais même pas que ce site existait! (Je suis principalement un développeur C#)

3 votes

La propriété CPU sur l'objet Process n'est pas un pourcentage de CPU, c'est le temps total du CPU depuis le démarrage du processus.

52voto

user176784 Points 1

Ceci est un simple en ligne qui gardera également les étiquettes en haut:

While(1) {ps | sort -des cpu | select -f 15 | ft -a; sleep 1; cls}

Cela fonctionne parce que formater le tableau sans aucun paramètre dessine simplement le tableau par défaut. autosize est utilisé pour ajuster automatiquement la largeur de la colonne afin que toutes les données puissent tenir à l'écran.


Décomposition des commandes raccourcies:

  • select -f: raccourci pour -first
  • ft: raccourci pour Format-Table
  • -a: raccourci pour -autosize
  • sleep: par défaut en utilisant des secondes

8 votes

CPU dans ps est le nombre de secondes d'utilisation totale, pas le % CPU. Donc ce n'est pas si utile.

35voto

fireforge124 Points 389

Une solution similaire aux autres, mais utilisant Get-Counter au lieu de Get-Process :

While(1) {  $p = get-counter '\Process(*)\% Processor Time'; cls; $p.CounterSamples | sort -des CookedValue | select -f 15 | ft -a}

Exemple de sortie :

Path                                                      InstanceName              CookedValue
----                                                      ------------              -----------
\\server_name\process(_total)\% processor time                 _total               4806.03969127454
\\server_name\process(idle)\% processor time                   idle                 1103.7573538257
\\server_name\process(program2)\% processor time               program              749.692930701698
\\server_name\process(program5)\% processor time               program              563.424255927765
\\server_name\process(program1)\% processor time               program              535.714866291973
\\server_name\process(program6)\% processor time               program              455.665518455242
\\server_name\process(program3)\% processor time               program              426.416718284128
\\server_name\process(program)\% processor time                program              395.628507577693
\\server_name\process(program4)\% processor time               program              335.591496700144
\\server_name\process(microsoftedgecp2)\% processor time       microsoftedgecp      129.310484967028
\\server_name\process(system)\% processor time                 system               80.0493478367316
\\server_name\process(chrome8)\% processor time                chrome               1.53941053532176

J'ai constaté que la plupart des autres solutions utilisant Get-Process rapportent le temps total du processeur depuis le démarrage du processus, ce qui n'était pas utile sur mon serveur qui reste allumé 24 heures sur 24, 7 jours sur 7 où le résultat principal était toujours svchost et system à des millions de secondes.

  • Un véritable équivalent de top ou du Gestionnaire des tâches donnerait un aperçu de l'utilisation du CPU enregistrée récemment sur une période fixe et Get-Counter fournit cela. J'ai pensé que cette alternative valait la peine d'être partagée car cette question est toujours le résultat principal sur Google pour powershell top.

Basé sur l'Exemple 13 de la documentation de Get-Counter docs, une explication de la commande :

  • While(1) { : Crée une boucle

  • get-counter '\Process(*)\% Processor Time' : Sélectionne les données du % de CPU, ce qui prend un certain temps pour revenir, donc pas besoin de sleep

  • cls : Efface pour la nouvelle table

  • sort -des CookedValue : Trie du plus grand au plus petit pour CookedValue [champ qui nous intéresse]

  • select -f 15 : Affiche les 15 premiers

  • ft -a : Affiche dans un tableau formaté

5 votes

C'est la meilleure réponse : Get-Counter vous donne le CPU "instantané", plutôt que le temps CPU cumulatif de ps. Meilleur formatage : Get-Counter '\Process(*)\% Processor Time' | Select-Object -ExpandProperty countersamples| Select-Object -Property instancename, cookedvalue| ? {$_.instanceName -notmatch "^(idle|_total|system)$"} | Sort-Object -Property cookedvalue -Descending| Select-Object -First 25| ft InstanceName,@{L='CPU';E={($_.Cookedvalue/100/$env:NUMBER_OF‌​_PROCESSORS).toStrin‌​g('P')}} -AutoSize

0 votes

J'ai rencontré des problèmes avec des erreurs causant l'arrêt de la commande avant de signaler tous les processus en cours d'exécution. Ceci peut être évité avec: $p = get-counter '\Process(*)\% Processor Time' -ErrorAction SilentlyContinue Comme vous pouvez l'imaginer, cela rapportera autant de processus que possible.

0 votes

Meilleure réponse ! La version internationale qui fonctionne sur les installations allemandes/françaises, etc. est while(1) { $p = Get-Counter -Counter '\230(*)\6' ; clear ; $p.CounterSamples | Sort-Object -Descending CookedValue | Select-Object -First 25} - Voir HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Perflib\\Counter pour savoir quel numéro représente quoi.

29voto

RobM Points 386

Je ne connais pas de commande unique qui puisse faire cela, mais comme tu le dis, les scripts sont faciles à écrire pour émuler top.

while (1) { ps | sort -desc cpu | select -first 30; sleep -seconds 2; cls }

0 votes

Fermé assez - Je peux l'ajuster d'ici... bien, fait! (Je suis un développeur C#, mais je gère aussi nos serveurs - donc j'apprends le PowerShell...)

0 votes

Si vous voulez en savoir plus - par exemple - consultez www.poshcode.org

0 votes

@TimAtVenturality - Vous pouvez envelopper le script dans une fonction avec des paramètres pour reproduire plus étroitement le haut.

12voto

Geograph Points 285

Vous pouvez essayer NTop (binaires), une alternative à htop pour Windows, avec émulation Vi pour Windows:

Capture d'écran

  • Options de ligne de commande:

    • C: Utiliser le schéma de couleurs monochrome
    • h: Afficher l'aide
    • p : Afficher uniquement les PID donnés
    • s : Trier par cette colonne
    • u : Afficher uniquement les processus appartenant à cet utilisateur
    • v: Imprimer la version
  • Commandes interactives:

    • , , PageUp, PageDn, j, k: Faire défiler la liste des processus
    • CTRL+ ou : Changer la colonne de tri des processus
    • g: Aller au début de la liste des processus
    • G: Aller à la fin de la liste des processus
    • Espace: Marquer un processus sélectionné
    • U: Désélectionner tous les processus marqués
    • K: Tuer tous les processus marqués
    • I: Inverser l'ordre de tri
    • F: Suivre le processus
      Si l'ordre de tri fait que le processus actuellement sélectionné se déplace dans la liste, faire en sorte que la barre de sélection le suive (déplacer le curseur manuellement désactive automatiquement cette fonction).
    • n: Suivant dans la recherche
    • N: Précédent dans la recherche
  • Commandes Vi:

    • :exec : Exécute la commande Windows donnée
    • :kill : Tuer tous les processus donnés
    • :q ou :quit: Quitter NTop
    • / ou :search : Faire une recherche
    • :sort : Trier la liste des processus selon la colonne donnée
    • :tree: Voir l'arborescence des processus

2 votes

Pouvez-vous développer comment accomplir la solution avec ceci? de la revue Bonne orientation sur la recommandation de logiciels ici

11voto

PaulAdamDavis Points 419

Fournit de jolis en-têtes en haut de chaque mise à jour sans avoir besoin de vider l'ensemble de la console :

$saveY = [console]::CursorTop
$saveX = [console]::CursorLeft

while ($true) {
  Get-Process | Sort -Descending CPU | Select -First 30;
  Sleep -Seconds 2;
  [console]::setcursorposition($saveX,$saveY+3)
}

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X