Должно работать на любом терминале поддерживающем VT Escape
последовательности,
проверено в Linux, True64 и HP-UX.#!/bin/ksh
SLEEP=$1
FIELD=$2
[ -z "$1" ] && SLEEP=10
[ -z "$2" ] && FIELD=1
clear
lines=`tput lines`
lines=$((lines-5))
echo "\t\t`tput rev``hostname` TOP $lines PROCESESS at `date '+%H:%M:%S'` every $SLEEP seconds`tput sgr0`"
tput bold
case `uname` in
Linux) PS_COMMAND="ps -e -o pcpu= -o cputime= -o user= -o uid= -o pid= -o pmem= -o rssize= -o comm="
HEADER_COMMAND="ps f -p $$ -o pcpu,cputime,user,uid,pid,pmem,rssize,command"
;;
HP-UX) UNIX95=1
export UNIX95
PS_COMMAND="ps -e -o pcpu= -o time= -o user= -o uid= -o pid= -o vsz= -o sz= -o comm="
HEADER_COMMAND="ps -p $$ -o pcpu,time,user,uid,pid,vsz,sz,comm"
;;
*) PS_COMMAND="ps -ef -o pcpu=,cputime=,user=,uid=,pid=,pmem=,rssize=,comm="
HEADER_COMMAND="ps -f -p $$ -o pcpu,cputime,user,uid,pid,pmem,rssize,command"
;;
esac
$HEADER_COMMAND | head -1
tput sgr0
while [ true ] ; do
tput cup 2 0
$PS_COMMAND | sort -r -n -k"$FIELD" | head -$lines
sleep $SLEEP
tput ed
done
URL:
Обсуждается: http://www.opennet.me/tips/info/1351.shtml
Еммм ...
В цикле while tput ed надо перенести сразу за
tput cups 2 0 .
в солярке не канает:
ps: unknown output format: -o cputime
Ну теперь "канает" и на солярке .
Rabotaet.
no tam est' predustanovlennyj 'prstat'
Да везде есть какое то подобие .
Но на Tru64 , например стандартный top падает и кроме всего
прочего он идет отдельно , не в базовом пакете .
Короче это не замена , это дополнение :)
а uptime как на bash?
:-)
cat /proc/uptime, ну и далее по усмотрению.
а зачемчем эта реализация отличается от
while : ; do
clear
top -b -n 1 -d <delay>
[ $? -еq 0 ] && break
donetop -b использует dumb терминал
поправка
$? -еq 0 ] || break
пришлось убрать двойные скобки в 11 строке, под убунтером тож нормально заработало.
правильно будет заменить {lines-5}
Ну вот , ЭТО моргает гораздо меньше :)
#!/bin/kshSLEEP=$1
FIELD=$2
[ -z "$1" ] && SLEEP=5
[ -z "$2" ] && FIELD=1
stty_save=`stty -g`
trap "stty $stty_save ; controlC ; exit; " EXIT
trap "eval `resize`;lines=`tput lines`; cols=`tput cols`;" WINCH
stty sane
clear
lines=`tput lines`
lines=$((lines-5))
date=`date '+%H:%M:%S'`
DATE=$date
REVERSE=`tput rev`
HOSTNAME=`hostname`
RESET=`tput sgr0`
UPTIME=`uptime | awk -F"," '{print $4 $5 $6 }' | awk -F":" '{print $2}'`
RHEAD="echo \t\t$REVERSE $HOSTNAME TOP $lines PROCESESS at $DATE every $SLEEP sec $UPTIME $RESET"
#echo $RHEAD
tput bold
case `uname` in
Linux) PS_COMMAND="ps -e -o pcpu= -o cputime= -o user= -o uid= -o pid= -o pmem= -o rssize= -o command="
HEADER_COMMAND="ps f -p $$ -o pcpu,cputime,user,uid,pid,pmem,rssize,command"
;;
HP-UX) UNIX95=1
export UNIX95
PS_COMMAND="ps -e -o pcpu= -o time= -o user= -o uid= -o pid= -o vsz= -o sz= -o comm="
HEADER_COMMAND="ps -p $$ -o pcpu,time,user,uid,pid,vsz,sz,comm"
;;
SunOS) HEADER_COMMAND="ps -f -p $$ -o pcpu,time,user,uid,pid,pmem,rss,comm"
PS_COMMAND="ps -e -o pcpu= -o time= -o user= -o uid= -o pid= -o pmem= -o rss= -o comm="
;;*) PS_COMMAND="ps -ef -o pcpu=,cputime=,user=,uid=,pid=,pmem=,rssize=,command="
HEADER_COMMAND="ps -f -p $$ -o pcpu,cputime,user,uid,pid,pmem,rssize,command"
;;
esac
tput cup 1 0
$HEADER_COMMAND | head -1
tput sgr0collect () {
if [ -x /home/tomko/bin/date.tom -a `uname` != Linux ];then
DATE_COMMAND="/home/tomko/bin/date.tom +%s"
else
DATE_COMMAND="date +%S"
fi
from=`$DATE_COMMAND`
rm -f /tmp/_col_.$$
$PS_COMMAND |cut -c -`tput cols` |sort -r -n -k"$FIELD" |head -$lines > /tmp/_col_.$$ &
UPTIME=`uptime | awk -F"," '{print $4 $5 $6 }' | awk -F":" '{print $2}' &`
wait
to=`$DATE_COMMAND`
}controlC () {
rm -f /tmp/_col_.$$ 2>/dev/null
}present () {
# cup positon cursor on x x
tput cup 0 0
# el clear to end of line
#tput el
DATE=`date '+%H:%M:%S'`
RHEAD="\t$REVERSE $HOSTNAME TOP $lines PROCESESS at $DATE every $SLEEP sec $UPTIME $RESET"
echo $RHEAD
tput cup 2 0
# ed clear to end of screen
tput ed
[ -f /tmp/_col_.$$ ] && {
cat /tmp/_col_.$$
rm -f /tmp/_col_.$$
}
}OLDSLEEP=$SLEEP
while [ true ] ; do
collect
present
diff=$(($to-$from))
SLEEP=$(($SLEEP-$diff))
[ $SLEEP -lt 0 ] && SLEEP=0
sleep $SLEEP
SLEEP=$OLDSLEEP
done