powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Unix-системы [игнор отключен] [закрыт для гостей] / Вопрос к знатокам баша
7 сообщений из 7, страница 1 из 1
Вопрос к знатокам баша
    #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
Вопрос к знатокам баша
    #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
Вопрос к знатокам баша
    #38152522
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нет, это совсем плохо.
Тогда уж лучше переделать алгоритм (запоминать предыдущий текст, чтобы знать, сколько \b нужно вставить).
...
Рейтинг: 0 / 0
Вопрос к знатокам баша
    #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
Вопрос к знатокам баша
    #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
Вопрос к знатокам баша
    #38152860
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Еще вопрос.
Как определить, запущен скрипт интерактивно или через какой-нибудь трубопровод (pipe)?
Если скрипт запускать с выводом в файл (например nohup pinger.sh), то escape-символы будут портить красивый вывод.
Поэтому я думаю проапгрейдить скрипт, чтобы при интерактивном запуске он работал, как сейчас, а если он запускается в конвеере, то длительность (time) выводить только при смене состояния или завершении мониторинга.
...
Рейтинг: 0 / 0
Вопрос к знатокам баша
    #38153236
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И еще момент, скрипт сделан для FreeBSD.
В линуксовой версии ping ключа -o нет, а вместо -t нужно использовать -W (или вообще не использовать).
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / Unix-системы [игнор отключен] [закрыт для гостей] / Вопрос к знатокам баша
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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