Czy istnieje sposób, aby stale wyświetlać procesy Windows w Cygwin

13

Chciałbym monitorować procesy z powłoki cygwin, używając top lub variant. Powodem tego jest raportowanie w czasie rzeczywistym i ciągłe aktualizacje. Jednak w cygwin top nie będzie raportował procesów Windows.

Fora, które poleciłem ps -Wjako alternatywę, ale oczywiście mają tę wadę, że nie dają mi już informacji w czasie rzeczywistym, a jedynie statyczną migawkę za każdym razem, gdy wpisuję polecenie.

Czy jest jakiś sposób na toprozpoczęcie pracy w cygwin, aby wyświetlić wszystkie moje procesy, a nie tylko procesy cygwins?

Husman
źródło
1
Czy jest jakiś powód, dla którego musi się on opierać w Cygwin? Jeśli chcesz czegoś, co zapewnia szczegółową listę danych na temat uruchamiania procesów systemu Windows w formacie tabelarycznym (jak top), wypróbuj Process Explorer
Darth Android

Odpowiedzi:

12

Z powłoki bash możesz monitorować wszystkie procesy systemu Windows za pomocą tego wiersza poleceń:

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

Aby zobaczyć wszystkie procesy Java, na przykład:

watch "ps -W | grep java"

Zauważ, że „ps -W” wymienia zarówno procesy cygwin, jak i procesy inne niż cygwin.

philwalk
źródło
Albo ps -Walbo ps --windowspraca, patrzps --help
Timo
2

Musisz zainstalować bibliotekę procps dla cygwin, obejmuje to najlepszy program, jednak będzie to tylko lista procesów uruchomionych w cygwin. Jeśli chcesz zobaczyć wszystkie procesy działające w systemie Windows, zapoznaj się z tą odpowiedzią: /programming/3503681/cygwin-top-command-see-processes-for-all-users

Jordan LaPrise
źródło
1

Wygląda na to, że możesz zrobić coś takiego:

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

Czasy trybu użytkownika i jądra wydają się być wyrażone w 1/10 000 000 sekundy.

Powinieneś być w stanie przetworzyć dane wyjściowe, aby uzyskać zużycie procesora na sekundę.

Tutaj używając cygwina 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 ""
    }'

Wyprowadza coś takiego:

0       System Idle Process     588.12377
2196    sh.exe  107.00075
248     svchost.exe     85.80055
7140    explorer.exe    26.52017
[...]

każda sekunda.

Zauważ, że jeśli proces bezczynności systemu pokazuje prawie 800% w bezczynnym systemie, dzieje się tak dlatego, że twój system ma 8 rdzeni procesora (co najmniej 8 wątków), ponieważ odlicza czas procesora wszystkich procesorów.

Zauważ też, że EVERY:1powyższe jest kłamstwem. wmicnie wydaje się dawać takiej mocy co sekundę. Bardziej prawdopodobne, że śpi około 1 sekundy między każdym raportem i nie rekompensuje czasu potrzebnego na obliczenie raportu. Tak więc w praktyce będzie on działał co 1 sekundę i trochę, co oznacza, że ​​te wartości procentowe nie są bardzo dokładne i nieco zawyżone.

sch
źródło