Parece que você pode fazer algo como:
wmic process get ProcessId,Name,UserModeTime,KernelModeTime /EVERY:1
Os horários dos modos Usuário e Kernel parecem ser expressos em 1/10.000.000 de segundos.
Você deve poder pós-processar essa saída para obter o uso da CPU por segundo.
Aqui usando o cygwin's perl
:
wmic process get ProcessId,Name,UserModeTime,KernelModeTime /EVERY:1 |
perl -lne '
if (/\S/) {
my ($k,$c,$p,$u) = split /\s{2,}/;
$n{"$p\t$c"}=$k+$u;
} else {
my %c;
for my $k (keys %n) {
$c{$k} = $n{$k} - $o{$k} if defined $o{$k}
}
print "$_\t" . $c{$_}/1e5 for (sort {$c{$b}<=>$c{$a}} keys %c)[0..20];
%o = %n; %n = undef; print ""
}'
Produz algo como:
0 System Idle Process 588.12377
2196 sh.exe 107.00075
248 svchost.exe 85.80055
7140 explorer.exe 26.52017
[...]
todo segundo.
Observe que, se o Processo ocioso do sistema mostrar pouco menos de 800% em um sistema ocioso, é porque o seu sistema possui 8 núcleos de CPU (pelo menos 8 threads), pois isso conta o tempo de CPU de todas as CPUs.
Observe também que o EVERY:1
acima é uma mentira. wmic
parece não dar esse resultado a cada segundo. Provavelmente, ele dorme aproximadamente 1 segundo entre cada relatório e não compensa o tempo que leva para calcular o relatório. Portanto, na prática, ele será executado a cada 1 segundo e um pouco, o que significa que essas porcentagens não são muito precisas e são superestimadas.
top
), tente Process Explorer