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.

5voto

Micah Points 2587

Je ne suis pas au courant d'une cmdlet PowerShell offrant cette fonctionnalité, mais voici une commande externe freeware qui fait à peu près ce que vous voulez, pslist de Mark Russinovich dans la suite Sysinternals:

  • pslist fournit une liste des processus en cours d'exécution dans une vue configurable
  • pslist -s fournit le type de mise à jour continue que vous souhaitez, avec un taux de rafraîchissement par défaut d'une fois par seconde

Je préfère utiliser Process Explorer, l'interface graphique de Mark, mais pslist est pratique pour les sessions en console.

4voto

Clay Points 421

Enregistrez le contenu suivant sous mytop.ps1, dans un dossier de votre variable d'environnement PATH, puis utilisez l'une des commandes suivantes à partir de n'importe quelle console PowerShell :

  • mytop : [Par défaut] Trie par Mémoire et affiche les 30 premières lignes
  • mytop CPU 50 : Trie par 'CPU' et affiche les 50 premières lignes.
  • While(1) {$p = myTop Memory 50; cls; $p} : Actualise toutes les secondes

    ##################################################

    Équivalent de top Linux en PowerShell

    ################################################## if ($args[0] -eq $null) { $SortCol = "Memory" } else { $SortCol = $args[0] }

    if ($args[1] -eq $null) { $Top = 30 } else { $Top = $args[1] }

    $LogicalProcessors = (Get-WmiObject -class Win32_processor -Property NumberOfLogicalProcessors).NumberOfLogicalProcessors;

    function myTopFunc ([string]$SortCol = "Memory", [int]$Top = 30) {

    Vérifie le niveau d'utilisateur de PowerShell

    if ( ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent() ).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator) ) { $procTbl = get-process -IncludeUserName | select ID, Name, UserName, Description, MainWindowTitle } else { $procTbl = get-process | select ID, Name, Description, MainWindowTitle }

    Get-Counter '\Process(*)\ID Process', '\Process()\% Processor Time',` '\Process()\Working Set - Private'` -ea SilentlyContinue | foreach CounterSamples | where InstanceName -notin "total","memory compression" | group { $.Path.Split("\")[3] } | foreach { $procIndex = [array]::indexof($procTbl.ID, [Int32]$.Group[0].CookedValue) [pscustomobject]@{ Name = $.Group[0].InstanceName; ID = $.Group[0].CookedValue; User = $procTbl.UserName[$procIndex] CPU = if($.Group[0].InstanceName -eq "idle") { $.Group[1].CookedValue / $LogicalProcessors } else { $.Group[1].CookedValue }; Memory = $.Group[2].CookedValue / 1KB; Description = $procTbl.Description[$procIndex]; Title = $procTbl.MainWindowTitle[$procIndex]; } } | sort -des $SortCol | select -f $Top @( "Name", "ID", "User", @{ n = "CPU"; e = { ("{0:N1}%" -f $.CPU) } }, @{ n = "Memory"; e = { ("{0:N0} K" -f $_.Memory) } }, "Description", "Title" ) | ft -a }

    myTopFunc -SortCol $SortCol -top $Top

Exemple de sortie :

Name                               ID User                         CPU   Memory       Description
----                               -- ----                         ---   ------       -----------
sqlservr                         7776 NT SERVICE\MSSQLSERVER       0.0%  19,001,488 K SQL Server Windows NT - 64 Bit
python                          12872 NA\user1                     0.0%  2,159,796 K  Python
svchost                          3328 NT AUTHORITY\SYSTEM          1.6%  1,022,080 K  Host Process for Windows Services
onedrive                        11872 NA\user1                     0.0%  423,396 K    Microsoft OneDrive
python                          13764 NA\user1                     0.0%  304,608 K    Python
chrome                          21188 NA\user1                     0.0%  250,624 K    Google Chrome
python                          28144 NA\user2                     0.0%  225,824 K    Python
code                            21384 NA\user1                     0.0%  211,160 K    Visual Studio Code
code                            27412 NA\user2                     0.0%  185,892 K    Visual Studio Code
ssms                            18288 NA\user1                     29.5% 155,452 K    SSMS
chrome                           7536 NA\user1                     0.0%  154,124 K    Google Chrome
code                            21652 NA\user1                     0.0%  149,900 K    Visual Studio Code
explorer                         3204 NA\user1                     0.0%  134,340 K    Windows Explorer
python                          11712 NA\user1                     0.0%  130,624 K    Python
chrome                          21588 NA\user1                     0.0%  107,448 K    Google Chrome
code                            10152 NA\user1                     0.0%  100,880 K    Visual Studio Code
code                            20232 NA\user2                     0.0%  99,124 K     Visual Studio Code
python                          22184 NA\user1                     0.0%  94,800 K     Python
code                            14828 NA\user1                     0.0%  84,872 K     Visual Studio Code
searchui                        13344 NA\user1                     0.0%  78,260 K     Search and Cortana application
com.docker.service              10644 NT AUTHORITY\SYSTEM          0.0%  77,332 K     Docker.Service

Crédits supplémentaires aux réponses de rokumaru, LotPings et DBADon

3voto

Ross Wiley Points 31

Ceci est juste une façon légèrement plus agréable, car vous voyez les en-têtes en haut à chaque fois:

While (1) {
  Ps | Sort -desc cpu | Select -first 30; Sleep -seconds 2; Cls;
  Write-Host "Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)     Id ProcessName";
  Write-Host "-------  ------    -----      ----- -----   ------     -- -----------"
}

Ceci est juste une façon légèrement plus agréable, car vous voyez les en-têtes en haut à chaque fois

3voto

Chomarat Julien Points 11

J'ai écrit wttop, un top pour le nouveau terminal Windows qui peut être lancé via Powershell.

2voto

Hames Points 251

Cela pourrait également faire l'affaire :

function htopish {
  Param (
  [Parameter(Position=1)] [Alias("l")]
  [int]$TotalList=24,
  [Parameter(Position=2)] [Alias("r")]
  [int]$Invertal=1
  )
  Begin {}
  Process {
    While ($true) {
      $CounterSamples = Get-Counter '\Process(*)\ID Process','\Process(*)\% Processor Time','\Process(*)\Working Set' | Select-Object -Expand CounterSamples
      Clear-Host
      $CounterSamples | Group-Object { Split-Path $_.Path } | Where-Object {$_.Group[1].InstanceName -notmatch "^Idle|_Total|System$"} | Sort-Object -Property {$_.Group[1].CookedValue} -Descending | Select-Object -First $TotalList | Format-Table @{Name="ProcessId";Expression={$_.Group[0].CookedValue}},@{Name="ProcessorUsage";Expression={[System.Math]::Round($_.Group[1].CookedValue/100/$env:NUMBER_OF_PROCESSORS,4)}},@{Name="ProcessName";Expression={$_.Group[1].InstanceName}},@{Name="WorkingSet";Expression={[System.Math]::Round($_.Group[2].CookedValue/1MB,4)}}
    Sleep -Seconds $Invertal
  }
  }
  End {}
}
  • Function repose sur les échantillons de Get-Counter et affichera les ProcessId, ProcessName, ProcessorUsage et WorkingSet.
  • Cet échantillon de compteur pourrait être amélioré pour inclure User et CommandLine dans la sortie, mais je n'ai pas encore trouvé de moyen performant de le faire.

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