CygwinでWindowsプロセスを常に表示する方法はありますか


13

topまたはバリアントを使用して、cygwinシェルからプロセスを監視したいと思います。この理由は、リアルタイムのレポートと絶え間ない更新です。ただし、cygwinでは、topはWindowsプロセスについてレポートしません。

フォーラムをps -W代替手段として使用することをお勧めしますが、これには明らかに、リアルタイムの情報を提供するのではなく、コマンドを入力するたびに静的なスナップショットを提供するという欠点があります。

topcygwinsプロセスだけでなく、すべてのプロセスを表示するためにcygwinで作業する方法はありますか?


1
特にCygwinをベースにしなければならない理由はありますか?実行中のWindowsプロセスに関する詳細なデータのリストを表形式(たとえば)で提供するものが必要な場合は、Process Explorerをtop試してください
Darth Android

回答:


12

bashシェルから、次のコマンドラインを使用してすべてのWindowsプロセスを監視できます。

watch "ps -W" # pipe to grep for filtering

たとえば、すべてのJavaプロセスを表示するには:

watch "ps -W | grep java"

「ps -W」はcygwinプロセスと非cygwinプロセスの両方をリストすることに注意してください。


いずれかps -Wまたはps --windows作業、参照してくださいps --help
ティモ


1

次のようなことができるようです:

wmic process get ProcessId,Name,UserModeTime,KernelModeTime /EVERY:1

そこにあるユーザーおよびカーネルモードの時間は、1 / 10,000,000秒で表されるようです。

その出力を後処理して、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
[...]

毎秒。

アイドル状態のシステムでシステムアイドルプロセスが800%未満を示しているのは、システムに8つのCPUコア(少なくとも8つのスレッド)があり、すべてのCPUのCPU時間をカウントしているためです。

また、EVERY:1上記は嘘であることに注意してください。wmicその出力を毎秒与えるようには見えません。多くの場合、各レポート間で約1秒間スリープし、レポートの計算にかかる時間を補正しません。そのため、実際には1秒ごとに実行されるため、これらの割合はあまり正確ではなく、わずかに過大評価されます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.