ref: f3afdf563f784c0a5703496f48c1a72dff4617f4
dir: /toppish/
#!/bin/rc
# top
rfork en
flagfmt='d interval,m maxlines'
args=''
old=/tmp/top.$pid.old
new=/tmp/top.$pid.new
out=/tmp/top.$pid.out
int=5
max=20
len=()
fn usage{
aux/usage
exit usage
}
fn isfloat{
echo $1 | grep -s '^[0-9\.]+$'
}
fn isnum{
echo $1 | grep -s '^[0-9]+$'
}
fn get{
grep . */status |
sed '
s!/status:! !
s! +! !g
'
}
fn clear{
awk 'END { for(i = 0; i < '$len'; i++) printf "\x08" }' </dev/null
}
fn sigint{
rm -f $old $new $out
exit
}
fn top{
get | tee $new | join - $old |
awk '
{
newusr = $5
newsys = $6
oldusr = $17
oldsys = $18
delta = newusr + newsys - (oldusr + oldsys)
pid = $1
name = $2
user = $3
state = $4
mem = $11
usr = newusr / 1000
sys = newsys / 1000
printf("%-10s %8s %6s %4ld:%.2ld %3ld:%.2ld %8ldK %-8s %s\n",
user, pid, delta,
usr / 60, usr % 60,
sys / 60, sys % 60,
mem, state, name)
}
' |
sort -nr +2 -3 | sed $max^q
mv $new $old
}
if(! ifs=() eval `{aux/getflags $*})
usage
if(~ $#flagd 1){
if(! isfloat $flagd)
usage
int=$flagd
}
if(~ $#flagm 1){
if(! isnum $flagm)
usage
max=$flagm
}
cd /proc
ramfs
get >$old
sleep $int
while(){
{
echo
uptime
top
} >$out
if(~ $#len 1)
clear
len=`{wc -r <$out}
cat $out
sleep $int
}