#!perl #Modify the line below ($PIO =...) as needed. #topio: This Perl script launches pio.vbs (Process I/O) to probe all processes #on the system and sort them based on a desired I/O counter. #Best run in 132 character width console window. #(C) Yong Huang, 2004,2010 #http://yong321.freeshell.org/freeware/pio.html $PIO = "pio.vbs"; #in same folder as pio.vbs; absolute path is recommended, e.g. "d:\\systools\\pio.vbs" ########## No need to modify below this line but hacking is welcome. ########## use Getopt::Std; getopts('s:n:m:k:h'); if (defined $opt_h) { print "Usage: $0 [-s Delay] [-n Top_n_lines] [-m remotesvr] [-k sortkey] [-h] -s: Number of seconds delay between calls (default 5) -n: Only show top n processes (default 10) -m: machine or host where processes are probed (default localhost) -k: sort key (default DltRBts) r: for DltRBts (delta read bytes); R: DltR (delta reads); i: RBytes (mnemonic:input); I: Reads; w: DltWBts; W: DltW; o: WBytes; O: Writes (mnemonic:output) c: DltCBts (delta control bytes); C: DltC; t: CBytes; T: Controls (mnemonic:conTrol) f: DltPF (delta page faults); F: PF -h: Show this Usage Example (show top 3 processes every 2 seconds on www, sorted by DltRBts): perl $0 -mwww -s2 -n3 -kr This program is best run in 132 character width console window.\n"; exit; } $opt_s = 5 if !defined $opt_s; $opt_n = 10 if !defined $opt_n; $opt_m = "localhost" if !defined $opt_m; $opt_k = "r" if !defined $opt_k; #Format to be used by write: #pid, name, rbytes, delta rbytes, reads, delta reads, wbytes, delta wbytes, writes, delta writes, cbytes, delta cbytes, controls, delta controls, pagefaults, delta pagefaults format = @>>>> @<<<<<<<<<<<< @>>>>>>>>> @>>>>>> @>>>>>> @>>> @>>>>>>>>>> @>>>>>> @>>>>>> @>>> @>>>>>>>>>> @>>>>>> @>>>>>>> @>>> @>>>>>> @>>> $_,$HoA{$_}[0],$HoA{$_}[1],$dltrdb{$_},$HoA{$_}[2],$dltrd{$_},$HoA{$_}[3],$dltwtb{$_},$HoA{$_}[4],$dltwt{$_},$HoA{$_}[5],$dltctb{$_},$HoA{$_}[6],$dltct{$_},$HoA{$_}[7],$dltpf{$_} . undef $/; while (1) { $_ = qx{cscript $PIO $opt_m}; #slurp in all `cscript pio.vbs` output @lines = split /\n/; %allpids = (); #%allpids is used to delete pid's that're gone between calls to pio foreach (@lines) { #Each line is: pid ProcName RdBytes Rds WtBytes Wts CtBytes Cts next unless /^(\d+)\t(.*)/; $pid = $1; #@pval: all last 8 columns of one line, i.e. values for this pid #pval[0]:ProcName; [1]:RdBytes; [2]:Rds; [3]:WtBytes; [4]:Wts; [5]:CtBytes; [6]:Cts; [7]:PFs @pval = split /\t/,$2; if (defined $HoA{$pid}[2]) #it's not defined in first iteration { $dltrdb{$pid} = $pval[1] - $HoA{$pid}[1]; #Delta RdBytes $dltrd{$pid} = $pval[2] - $HoA{$pid}[2]; #Delta Rds $dltwtb{$pid} = $pval[3] - $HoA{$pid}[3]; #Delta WtBytes $dltwt{$pid} = $pval[4] - $HoA{$pid}[4]; #Delta Wts $dltctb{$pid} = $pval[5] - $HoA{$pid}[5]; #Delta CtBytes $dltct{$pid} = $pval[6] - $HoA{$pid}[6]; #Delta Cts $dltpf{$pid} = $pval[7] - $HoA{$pid}[7]; #Delta PFs } $HoA{$pid} = [ @pval ]; #$pid is key to this Hash of Array $allpids{$pid} = 1; #hash for all current processes } foreach (keys %HoA) { if (! exists $allpids{$_}) #this process has disappeared, clean the hashes { delete $HoA{$_}; delete $dltrdb{$_}; delete $dltrd{$_}; delete $dltwtb{$_}; delete $dltwt{$_}; delete $dltctb{$_}; delete $dltct{$_}; delete $dltpf{$_}; } } if (defined $show) #prevent printing all 0's the first time around { $n = 0; print "--PID ProcName---- -----RBytes DltRBts --Reads DltR -----WBytes DltWBts --Writs DltW -----CBytes DltCBts ---Cntls DltC --PFlts DltF\n"; if ($opt_k eq "r") #sort on delta rbytes { foreach (sort { $dltrdb{$b} <=> $dltrdb{$a} } keys %dltrdb) { write; last if ++$n == $opt_n; } } elsif ($opt_k eq "R") #sort on delta reads { foreach (sort { $dltrd{$b} <=> $dltrd{$a} } keys %dltrd) { write; last if ++$n == $opt_n; } } elsif ($opt_k eq "i") #sort on rbytes { foreach (sort { $HoA{$b}[1] <=> $HoA{$a}[1] } keys %HoA) { write; last if ++$n == $opt_n; } } elsif ($opt_k eq "I") #sort on reads { foreach (sort { $HoA{$b}[2] <=> $HoA{$a}[2] } keys %HoA) { write; last if ++$n == $opt_n; } } elsif ($opt_k eq "w") #sort on delta wbytes { foreach (sort { $dltwtb{$b} <=> $dltwtb{$a} } keys %dltwtb) { write; last if ++$n == $opt_n; } } elsif ($opt_k eq "W") #sort on delta writes { foreach (sort { $dltwt{$b} <=> $dltwt{$a} } keys %dltwt) { write; last if ++$n == $opt_n; } } elsif ($opt_k eq "o") #sort on wbytes { foreach (sort { $HoA{$b}[3] <=> $HoA{$a}[3] } keys %HoA) { write; last if ++$n == $opt_n; } } elsif ($opt_k eq "O") #sort on writes { foreach (sort { $HoA{$b}[4] <=> $HoA{$a}[4] } keys %HoA) { write; last if ++$n == $opt_n; } } elsif ($opt_k eq "c") #sort on delta cbytes { foreach (sort { $dltctb{$b} <=> $dltctb{$a} } keys %dltctb) { write; last if ++$n == $opt_n; } } elsif ($opt_k eq "C") #sort on delta controls { foreach (sort { $dltct{$b} <=> $dltct{$a} } keys %dltct) { write; last if ++$n == $opt_n; } } elsif ($opt_k eq "t") #sort on cbytes { foreach (sort { $HoA{$b}[5] <=> $HoA{$a}[5] } keys %HoA) { write; last if ++$n == $opt_n; } } elsif ($opt_k eq "T") #sort on controls { foreach (sort { $HoA{$b}[6] <=> $HoA{$a}[6] } keys %HoA) { write; last if ++$n == $opt_n; } } elsif ($opt_k eq "f") #sort on delta pagefaults { foreach (sort { $dltpf{$b} <=> $dltpf{$a} } keys %dltpf) { write; last if ++$n == $opt_n; } } elsif ($opt_k eq "F") #sort on pagefaults { foreach (sort { $HoA{$b}[7] <=> $HoA{$a}[7] } keys %HoA) { write; last if ++$n == $opt_n; } } } $show = 1; sleep $opt_s; }