URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID3
Нить номер: 36326
[ Назад ]

Исходное сообщение
"Раздел полезных советов: Реализация команды top на Shell"

Отправлено auto_tips , 26-Дек-06 15:16 
Должно работать на любом терминале поддерживающем 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


Содержание

Сообщения в этом обсуждении
"Реализация команды top на Shell"
Отправлено rstone , 26-Дек-06 15:16 
Еммм ...
В цикле while  tput ed надо перенести сразу за
tput cups 2 0 .

"Реализация команды top на Shell"
Отправлено anonymous_from_lor , 26-Дек-06 17:51 
в солярке не канает:
ps: unknown output format: -o cputime

"Реализация команды top на Shell"
Отправлено rstone , 27-Дек-06 11:37 
Ну теперь "канает" и на солярке .

"Реализация команды top на Shell"
Отправлено alex , 29-Дек-06 01:33 
Rabotaet.
no tam est' predustanovlennyj 'prstat'

"Реализация команды top на Shell"
Отправлено rstone , 30-Дек-06 13:45 
Да везде есть какое то подобие .
Но на Tru64  , например стандартный top падает и кроме всего
прочего он идет отдельно , не в базовом пакете .
Короче это не замена , это дополнение :)

"Реализация команды top на Shell"
Отправлено Аноним , 14-Янв-07 11:04 
а uptime как на bash?
:-)

"Реализация команды top на Shell"
Отправлено Deepwlaker , 15-Янв-07 06:09 
cat /proc/uptime, ну и далее по усмотрению.

"Реализация команды top на Shell"
Отправлено rmf , 30-Янв-07 14:13 
а зачем

чем эта реализация отличается от

while : ; do
  clear
  top -b -n 1 -d <delay>
  [ $? -еq 0 ] && break
done

top -b использует dumb терминал


"Реализация команды top на Shell"
Отправлено rmf , 30-Янв-07 14:13 
поправка
$? -еq 0 ] || break

"Реализация команды top на Shell"
Отправлено hand , 15-Ноя-07 23:55 
пришлось убрать двойные скобки в 11 строке, под убунтером тож нормально заработало.

"Реализация команды top на Shell"
Отправлено hand , 15-Ноя-07 23:58 
правильно будет заменить {lines-5}

"Реализация команды top на Shell"
Отправлено rstone , 20-Ноя-07 11:08 
Ну вот , ЭТО  моргает гораздо меньше :)


#!/bin/ksh

SLEEP=$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 sgr0

collect () {
        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