Existe uma maneira de mostrar constantemente os processos do Windows no Cygwin

13

Eu gostaria de monitorar processos de um shell cygwin, usando top ou uma variante. A razão para isso é seus relatórios em tempo real e atualizações constantes. No entanto, no cygwin, o top não reportará os processos do Windows.

Nos fóruns que eu recomendo usar ps -Wcomo alternativa, mas isso obviamente tem a desvantagem de não me fornecer mais informações em tempo real, mas apenas um instantâneo estático sempre que eu digito o comando.

Existe alguma maneira de toptrabalhar no cygwin para exibir todos os meus processos e não apenas os processos de cygwins?

Husman
fonte
1
Existe uma razão para que especificamente tenha que ser baseado em Cygwin? Se você quer apenas algo que fornece uma lista detalhada de dados sobre processos Windows rodando em um formato tabular (como top), tente Process Explorer
Darth Android

Respostas:

12

Em um shell bash, você pode monitorar todos os processos do Windows com esta linha de comando:

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

Para ver todos os processos java, por exemplo:

watch "ps -W | grep java"

Observe que "ps -W" lista os processos cygwin e não cygwin.

Filadélfia
fonte
De qualquer ps -Wou ps --windowstrabalho, verps --help
Timo
2

Você precisa instalar a biblioteca procps para o cygwin, isso inclui o programa principal, no entanto, isso listará apenas os processos em execução no cygwin. Se você deseja ver todos os processos em execução no Windows, consulte esta resposta: /programming/3503681/cygwin-top-command-see-processes-for-all-users

Jordan LaPrise
fonte
1

Parece que você pode fazer algo como:

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

Os horários dos modos Usuário e Kernel parecem ser expressos em 1/10.000.000 de segundos.

Você deve poder pós-processar essa saída para obter o uso da CPU por segundo.

Aqui usando o 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 ""
    }'

Produz algo como:

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

todo segundo.

Observe que, se o Processo ocioso do sistema mostrar pouco menos de 800% em um sistema ocioso, é porque o seu sistema possui 8 núcleos de CPU (pelo menos 8 threads), pois isso conta o tempo de CPU de todas as CPUs.

Observe também que o EVERY:1acima é uma mentira. wmicparece não dar esse resultado a cada segundo. Provavelmente, ele dorme aproximadamente 1 segundo entre cada relatório e não compensa o tempo que leva para calcular o relatório. Portanto, na prática, ele será executado a cada 1 segundo e um pouco, o que significa que essas porcentagens não são muito precisas e são superestimadas.

sch
fonte