Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Unix-системы [игнор отключен] [закрыт для гостей] / Вопрос к знатокам баша / 7 сообщений из 7, страница 1 из 1
14.02.2013, 15:35
    #38151445
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос к знатокам баша
Есть такой скриптик:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
#!/usr/local/bin/bash

PING="ping -q -o -t 3 -c 3"
HOST=10.1.128.4
STATE=9
EXIT=0
CNT=0

function clock()
{
        date +"%Y-%m-%d %H:%M:%S"
}

function print()
{
        MSG=$1
        echo -n -e "$MSG"
        i=${#MSG}
        while [ $i -gt 0 ]
        do
                echo -n -e "\b"
                let i-=1
        done
}

echo "*"
echo "Host: $HOST"
echo "Started at: `clock`"
echo -n "."

trap "EXIT=1" HUP INT
while [ $EXIT -eq 0 ]
do
        $PING $HOST>/dev/null 2>&1
        if [ $? -eq 0 ]
        then
                if [ $STATE -eq 1 ]
                then
                        if [ $CNT -eq 0 ]
                        then
                                echo -n "time "
                        fi
                        let TIMER=`date +%s`-T0
                        print $TIMER
                        let CNT+=1
                else
                        echo ""
                        echo -n "$HOST, `clock`, state: ONLINE;  "
                        STATE=1
                        let CNT=0
                        T0=`date +%s`
                fi
                sleep 1
        else
                if [ $STATE -eq 0 ];
                then
                        if [ $CNT -eq 0 ]
                        then
                                echo -n "time "
                        fi
                        let TIMER=`date +%s`-T0
                        print $TIMER
                        let CNT+=1
                else
                        echo ""
                        echo -n "$HOST, `clock`, state: OFFLINE; "
                        STATE=0
                        let CNT=0
                        T0=`date +%s`
                fi
        fi
done

echo ""
echo "*"
echo "Finished at: `clock`"

Скрипт мониторинг какой-нибудь хост, указывая длительность онлайна или оффлайна хоста.
При нажатии Ctrl+C скрипт завершает опрос и указывает время завершения.
Но есть одна маленькая неприятность.

Во время опроса курсор мигает в позиции, в которой выводится длительность текущего состояния.
При нажатии Ctrl+C в эту позицию выводится текст "^C" и затирает указанное время.
Как бы это обойти?

Менять алгоритм (чтобы курсор мигал после цифр) слишком хлопотно.
________________________
Мы смотрим с оптимизмом...
...в оптический прицел.
...
Рейтинг: 0 / 0
15.02.2013, 00:54
    #38152138
Пухлый
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос к знатокам баша
Alibek B.,

Менять алгоритм (чтобы курсор мигал после цифр) слишком хлопотно.

А если как-то поменять?

Код: html
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
function print()
{
  MSG=$(($1+1))
        echo -n -e "$MSG"
        i=${#MSG}
  sleep 1
        while [ $i -gt 0 ]
        do
                echo -n -e "\b"
                let i-=1
        done
}
...
Рейтинг: 0 / 0
15.02.2013, 11:51
    #38152522
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос к знатокам баша
Нет, это совсем плохо.
Тогда уж лучше переделать алгоритм (запоминать предыдущий текст, чтобы знать, сколько \b нужно вставить).
...
Рейтинг: 0 / 0
15.02.2013, 12:28
    #38152605
Пухлый
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос к знатокам баша
Alibek B.Нет, это совсем плохо.
Тогда уж лучше переделать алгоритм (запоминать предыдущий текст, чтобы знать, сколько \b нужно вставить).

А чем плохо? вроде считает нормально (sleep там и так уже есть):

Код: html
1.
2.
3.
4.
5.
6.
Started at: 2013-02-15 12:04:36
.
10.1.1.1, 2013-02-15 12:04:36, state: OFFLINE; time 9
10.1.1.1, 2013-02-15 12:04:45, state: ONLINE;  time 20
*
Finished at: 2013-02-15 12:05:05
...
Рейтинг: 0 / 0
15.02.2013, 14:12
    #38152836
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос к знатокам баша
Во-первых лишняя секунда ожидания; у меня sleep выполняется только при положительном результате пинга, при отрицательном пауза и так будет из-за таймаута.
Во-вторых, будет выводиться неправильное время (на секунду больше фактического).

Переписал скрипт так, может быть кому-то будет полезен:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
#!/usr/local/bin/bash

PING="ping -q -o -t 3 -c 3"
HOST=10.1.128.4
STATE=9
EXIT=0
CNT=0

function clock()
{
        date +"%Y-%m-%d %H:%M:%S"
}

function print()
{
        MSG=$1
        PREV=$2
        i=${#PREV}
        while [ $i -gt 0 ]
        do
                echo -n -e "\b"
                let i-=1
        done
        echo -n -e "$MSG"
}

echo "*"
echo "Host: $HOST"
echo "Started at: `clock`"
echo -n "."

trap "EXIT=1" HUP INT
while [ $EXIT -eq 0 ]
do
        $PING $HOST>/dev/null 2>&1
        if [ $? -eq 0 ]
        then
                if [ $STATE -eq 1 ]
                then
                        if [ $CNT -eq 0 ]
                        then
                                echo -n "time "
                        fi
                        let TIMER=`date +%s`-T0
                        print $TIMER $S0
                        let CNT+=1
                        S0=$TIMER
                else
                        echo ""
                        echo -n "$HOST, `clock`, state: ONLINE;  "
                        STATE=1
                        let CNT=0
                        T0=`date +%s`
                        S0=""
                fi
                sleep 1
        else
                if [ $STATE -eq 0 ];
                then
                        if [ $CNT -eq 0 ]
                        then
                                echo -n "time "
                        fi
                        let TIMER=`date +%s`-T0
                        print $TIMER $S0
                        let CNT+=1
                        S0=$TIMER
                else
                        echo ""
                        echo -n "$HOST, `clock`, state: OFFLINE; "
                        STATE=0
                        let CNT=0
                        T0=`date +%s`
                        S0=""
                fi
        fi
done

echo ""
echo "*"
echo "Finished at: `clock`"
...
Рейтинг: 0 / 0
15.02.2013, 14:25
    #38152860
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос к знатокам баша
Еще вопрос.
Как определить, запущен скрипт интерактивно или через какой-нибудь трубопровод (pipe)?
Если скрипт запускать с выводом в файл (например nohup pinger.sh), то escape-символы будут портить красивый вывод.
Поэтому я думаю проапгрейдить скрипт, чтобы при интерактивном запуске он работал, как сейчас, а если он запускается в конвеере, то длительность (time) выводить только при смене состояния или завершении мониторинга.
...
Рейтинг: 0 / 0
15.02.2013, 17:27
    #38153236
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос к знатокам баша
И еще момент, скрипт сделан для FreeBSD.
В линуксовой версии ping ключа -o нет, а вместо -t нужно использовать -W (или вообще не использовать).
...
Рейтинг: 0 / 0
Форумы / Unix-системы [игнор отключен] [закрыт для гостей] / Вопрос к знатокам баша / 7 сообщений из 7, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]