web-dev-qa-db-ja.com

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

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

私がps -W代わりの方法ですが、これには明らかに、リアルタイムの情報が表示されず、コマンドを入力するたびに静的なスナップショットが表示されるという欠点があります。

topをcygwinで動作させて、cygwinsプロセスだけでなく、すべてのプロセスを表示する方法はありますか?

13
Husman

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

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

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

watch "ps -W | grep Java"

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

12
philwalk

Cygwin用のprocpsライブラリをインストールする必要があります。これには最上位のプログラムが含まれますが、cygwinで実行されているプロセスのみがリストされます。 Windowsで実行中のすべてのプロセスを確認する場合は、この回答を参照してください: https://stackoverflow.com/questions/3503681/cygwin-top-command-see-processes-for-all-users

2
Jordan LaPrise

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

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秒おきに実行されます。つまり、これらのパーセンテージはあまり正確ではなく、少し過大評価されています。

1
sch