Jump to content

Ruby sort ps

From EggeWiki
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

Today I needed to sort ps by the total CPU time. I also wanted to sum all the same type processes together. Here's the script I came up with

<geshi lang="ruby">

  1. !/bin/env ruby
  2. Given the output from 'ps -o user,time,nlwp,fname' this script will sum the CPU time

header = nil procs = {} procs.default = 0 while((line = STDIN.gets))

 f = line.chomp.split(' ') 
 if !header then 
   header = f 
   TIME = f.rindex('TIME')
   CMD = f.rindex('CMD') || f.rindex('COMMAND')
 else 
   time = f[TIME].split(':')
   seconds = time[0].to_i * 60 + time[1].to_i
   cmd = f[CMD]
   procs[cmd] += seconds
 end 

end

sum = 0.0 procs.each { |k,v| sum += v } sorted = procs.sort { |a,b| b[1]<=>a[1] } sorted.each do |k|

 puts sprintf("%-10s %5.2f%%", k[0], (k[1] / sum) * 100.0)

end </geshi>

Here's a sample of it's usage: <geshi lang="bash"> $ ps -A -o user,time,nlwp,fname | ./sumcputime.rb | head java 27.19% dataserv 20.10% Xvnc 7.21% view_ser 4.06% backupse 3.86% httpd 3.64% nscd 2.81% omniName 2.38% se.sparc 2.34% compute_ 2.10% </geshi>