#!/bin/awk -f BEGIN { nam=1; owner=2; status=3; usr=4; sys=5; real=6; cusr=7; csys=8; creal=9; siz=10 while ( 1 ) { lps = "ls -dp /proc/* | tr '\n' ' >[2] /dev/null '" # Due to races in /proc reading, procs can disapear under ls's feet, should # send ls's stderr to /dev/null lps | getline ps; close lps split(ps, psa) for ( p in psa ) { pid = psa[p] vals = "" gval = "/proc/"pid"/status" getline vals <gval; close gval if ( vals ~ "^$" ) continue # Process is gone split(vals, val) new[pid] = val[usr] + val[sys] delta[pid] = new[pid] - old[pid] inf[pid] = vals } delete old srt = "sort -r -n +2" for ( pid in delta ) { if ( delta[pid] > 0 ) { split(inf[pid], i) ut = i[usr]/1000 st = i[sys]/1000 s = sprintf("%-10s %8s %6s %4ld:%.2ld %3ld:%.2ld %7ldK %-8s %s", i[owner], pid, delta[pid], ut/60, ut%60, st/60, st%60, i[siz], i[status], i[nam]) print s|srt } old[pid] = new[pid] } delete new; delete delta; delete inf close(srt) print "----------------------------------------------------------------" system("sleep 1") } }