有没有办法在 Cygwin 中不断显示窗口进程

有没有办法在 Cygwin 中不断显示窗口进程

我想使用 top 或变体从 cygwin shell 监视进程。这样做的原因是它的实时报告和持续更新。但是在 cygwin 下,top 不会报告 windows 进程。

我曾去过的论坛推荐使用ps -W另一种方法,但这显然有一个缺点,就是它不再为我提供实时信息,而只是在我输入命令时提供静态快照。

有没有什么方法可以top在 cygwin 中工作以显示我的所有进程而不仅仅是 cygwins 进程?

答案1

从 bash shell,您可以使用以下命令行监视所有 Windows 进程:

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

查看所有 java 进程,例如:

watch "ps -W | grep java"

请注意,“ps -W”列出了 cygwin 和非 cygwin 进程。

答案2

您必须安装 cygwin 的 procps 库,其中包括 top 程序,但这只会列出在 cygwin 中运行的进程。如果您想查看在 Windows 上运行的所有进程,请参考此答案:https://stackoverflow.com/questions/3503681/cygwin-top-command-see-processes-for-all-users

答案3

看来你可以做类似的事情:

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

那里的用户模式和内核模式时间似乎以 1/10,000,000 秒来表示。

您应该能够对该输出进行后处理以获取每秒的 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 秒运行一次,这意味着这些百分比不是很准确,而且略微高估。

相关内容