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