Кажется, вы можете сделать что-то вроде:
wmic process get ProcessId,Name,UserModeTime,KernelModeTime /EVERY:1
Время в режиме пользователя и ядра, по-видимому, выражается в 1/10 000 000-й секунды.
Вы должны быть в состояниипост-процесс, который выводит данные об использовании ЦП в секунду.
Здесь используется 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 ""
}'
Выводит что-то вроде:
0 System Idle Process 588.12377
2196 sh.exe 107.00075
248 svchost.exe 85.80055
7140 explorer.exe 26.52017
[...]
каждыесекунда.
Обратите внимание, что если System Idle Process показывает в системе простоя чуть меньше 800%, то это потому, что ваша система имеет 8 ядер ЦП (ну, по крайней мере, 8 потоков), поскольку это подсчитываетПроцессорное время всех процессоров.
Также обратите внимание, что EVERY:1
выше - ложь.wmic
, похоже, не дает такой вывод каждую секунду.Скорее всего, он спит примерно 1 секунду между каждым отчетом и не компенсирует время, необходимое для вычисления отчета.Таким образом, на практике, он будет выполняться каждую 1 секунду и немного, что означает, что эти проценты не очень точны и слегка завышены.