Topまたはバリアントを使用して、cygwinシェルからプロセスを監視したいと思います。その理由は、リアルタイムのレポートと絶え間ない更新です。ただし、cygwinでは、topはWindowsプロセスについてレポートしません。
私がps -W
代わりの方法ですが、これには明らかに、リアルタイムの情報が表示されず、コマンドを入力するたびに静的なスナップショットが表示されるという欠点があります。
top
をcygwinで動作させて、cygwinsプロセスだけでなく、すべてのプロセスを表示する方法はありますか?
Bashシェルから、次のコマンドラインを使用してすべてのWindowsプロセスを監視できます。
watch "ps -W" # pipe to grep for filtering
すべてのJavaプロセスを表示するには、例えば:
watch "ps -W | grep Java"
「ps -W」はcygwinプロセスと非cygwinプロセスの両方をリストすることに注意してください。
Cygwin用のprocpsライブラリをインストールする必要があります。これには最上位のプログラムが含まれますが、cygwinで実行されているプロセスのみがリストされます。 Windowsで実行中のすべてのプロセスを確認する場合は、この回答を参照してください: https://stackoverflow.com/questions/3503681/cygwin-top-command-see-processes-for-all-users
次のようなことができるようです:
wmic process get ProcessId,Name,UserModeTime,KernelModeTime /EVERY:1
ユーザーモードとカーネルモードの時間は、1/10,000,000分の1秒で表されているようです。
その出力を後処理して、1秒あたりのCPU使用率を取得できるはずです。
ここでは、cygwinの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つのCPUコア(少なくとも8つのスレッド)があり、すべてのCPUのCPU時間をカウントするためです。
また、EVERY:1
上記は嘘です。 wmic
は毎秒その出力を提供するようには見えません。より可能性が高いのは、各レポート間で約1秒スリープし、レポートの計算にかかる時間を補わないためです。したがって、実際には、1秒おきに実行されます。つまり、これらのパーセンテージはあまり正確ではなく、少し過大評価されています。