Apakah ada cara untuk menunjukkan proses windows di Cygwin terus-menerus

13

Saya ingin memantau proses dari cangkang cygwin, menggunakan varian teratas. Alasan untuk ini adalah pelaporan waktu nyata dan pembaruan konstan. Namun di bawah cygwin, top tidak akan melaporkan proses windows.

Forum yang saya rekomendasikan untuk digunakan ps -Wsebagai alternatif, tetapi ini jelas memiliki kekurangan tidak lagi memberi saya informasi waktu nyata, tetapi hanya foto statis setiap kali saya mengetik perintah.

Apakah ada cara untuk mulai topbekerja di cygwin untuk menampilkan semua proses saya dan bukan hanya proses cygwin?

Husman
sumber
1
Apakah ada alasan khusus untuk itu harus berbasis di Cygwin? Jika Anda hanya menginginkan sesuatu yang menyediakan daftar data terperinci tentang menjalankan proses windows dalam format tabular (seperti top), coba Process Explorer
Darth Android

Jawaban:

12

Dari bash shell, Anda dapat memantau semua proses windows dengan baris perintah ini:

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

Untuk melihat semua proses java, misalnya:

watch "ps -W | grep java"

Perhatikan bahwa "ps -W" mencantumkan proses cygwin dan non-cygwin.

philwalk
sumber
Entah ps -Watau ps --windowsbekerja, lihatps --help
Timo
2

Anda harus menginstal pustaka procps untuk cygwin, ini termasuk program teratas, namun itu hanya akan mendaftar proses yang berjalan di cygwin. Jika Anda ingin melihat semua proses berjalan di windows, lihat jawaban ini: /programming/3503681/cygwin-top-command-see-processes-for-all-users

Jordan LaPrise
sumber
1

Tampaknya Anda dapat melakukan sesuatu seperti:

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

Mode Pengguna dan Kernel kali di sana tampaknya dinyatakan dalam 1 / 10.000.000 detik.

Anda harus dapat memposting-proses output itu untuk mendapatkan penggunaan CPU per detik.

Di sini menggunakan 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 ""
    }'

Menghasilkan sesuatu seperti:

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

setiap detik.

Perhatikan bahwa jika System Idle Process menunjukkan kurang dari 800% pada sistem idle, itu karena sistem Anda memiliki 8 core CPU (setidaknya 8 thread) yang menghitung waktu CPU dari semua CPU.

Perhatikan juga bahwa di EVERY:1atas adalah dusta. wmictampaknya tidak memberikan output setiap detik. Kemungkinan besar, itu tidur sekitar 1 detik antara setiap laporan dan tidak mengkompensasi waktu yang diperlukan untuk menghitung laporan. Jadi dalam praktiknya, ini akan berjalan setiap 1 detik dan sedikit yang berarti persentase tersebut tidak terlalu akurat dan sedikit berlebihan.

sch
sumber