Есть ли способ постоянно показывать процессы Windows в Cygwin?


13

Я хотел бы отслеживать процессы из оболочки Cygwin, используя top или вариант. Причиной этого являются его отчеты в реальном времени и постоянные обновления. Однако в Cygwin top не будет сообщать о процессах Windows.

Форумы, которые я рекомендовал использовать ps -Wв качестве альтернативы, но, очевидно, у этого недостатка больше нет предоставления мне информации в реальном времени, а просто статический снимок всякий раз, когда я набираю команду.

Есть ли способ заставить topработать в cygwin отображение всех моих процессов, а не только процессов cygwins?


1
Есть ли причина, по которой он должен базироваться в Cygwin? Если вам просто нужно что-то, что предоставляет подробный список данных о запущенных процессах Windows в табличном формате (например top), попробуйте Process Explorer
Darth Android,

Ответы:


12

Из оболочки Bash вы можете отслеживать все процессы Windows с помощью этой командной строки:

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

Чтобы увидеть все процессы Java, например:

watch "ps -W | grep java"

Обратите внимание, что "ps -W" перечисляет процессы cygwin и non-cygwin.


Либо ps -Wили ps --windowsработай, см.ps --help
Тимо

2

Вы должны установить библиотеку procps для cygwin, в нее входит программа верхнего уровня, однако в ней будут перечислены только процессы, запущенные в cygwin. Если вы хотите увидеть все процессы, работающие в Windows, обратитесь к этому ответу: /programming/3503681/cygwin-top-command-see-processes-for-all-users


1

Кажется, вы можете сделать что-то вроде:

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
[...]

каждую секунду.

Обратите внимание, что если в режиме ожидания в системном процессе отображается чуть менее 800%, то это потому, что ваша система имеет 8 ядер ЦП (а не менее 8 потоков), так как это подсчитывает время ЦП всех ЦП.

Также обратите внимание, что EVERY:1вышесказанное является ложью. wmicкажется, не дает такой вывод каждую секунду. Скорее всего, он спит примерно 1 секунду между каждым отчетом и не компенсирует время, необходимое для вычисления отчета. Таким образом, на практике, он будет выполняться каждую 1 секунду и немного, что означает, что эти проценты не очень точны и слегка завышены.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.