LJ Archive CD

Listing 1.

local lasttimes, timerid

on updatelist
  local procstat, newtotaltime, totaltime, procs, procid, procpath
  local newtime, percenttime, toplist

# let the user know we're working
  set the cursor to watch
  put readfile("/proc/stat") into procstat
# compute total user, system, and idle time
  put word 2 of procstat + word 3 of procstat + word 4 of procstat\
        + word 5 of procstat into newtotaltime
# the first time through, totaltime will be 0, so prevent divide by 0
  put max(1, newtotaltime - lasttimes["total"]) into totaltime
  put newtotaltime into lasttimes["total"]
# get a list of directories along with the owner of each
  put shell("ls -l /proc") into procs
  delete line 1 of procs # delete "total" line
  repeat for each line l in procs
    put the last word of l into procid
    if procid is not a number then next repeat
# build up path by concatenating id and a trailing "/"
    put "/proc/" & procid & "/" into procpath
    put readfile(procpath & "stat") into procstat
    if procstat is empty then next repeat # no file
    put word 14 of procstat + word 15 of procstat into newtime
    put (newtime - lasttimes[procid]) / totaltime * 100 into percenttime
# store time into associative array by proc id
    put newtime into lasttimes[procid]
# format one line of output using format function (like C printf function)
    put format("%5s %-10s %5d %5d %4d %s\n", word 1 of procstat, word 3 of l,\
          word 23 of procstat div 1024, word 24 of procstat * 4, percenttime,\
          readfile(procpath & "cmdline")) after toplist
  end repeat
  delete last char of toplist # get rid of trailing newline
# double sort sorts by process size and then by CPU usage
  sort lines of toplist numeric by word 4 of each
  sort lines of toplist descending numeric by word 5 of each
  put toplist into field "toplist"
# set up a call back in a few seconds
  send "updatelist" to me in (the updateinterval of me) seconds
  put the result into timerid
  disable button "Kill Process"
  set the cursor to hand
end updatelist
LJ Archive CD