Отслеживание линка на сетевухе

Программирование на sh, быть может немного про альтернативные языки
Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
daemon
рядовой
Сообщения: 34
Зарегистрирован: 2009-12-21 11:49:15

Отслеживание линка на сетевухе

Непрочитанное сообщение daemon » 2009-12-21 11:58:58

Добрый день!

Вопрос в теме озвучен, нужно как то отследить пропадание линка на сетевухе. Не пинга, ни другие методы мониторинга, а именно железно - оборудование выключено линка нет, регистрация этого дела в системе и действие.

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/


daemon
рядовой
Сообщения: 34
Зарегистрирован: 2009-12-21 11:49:15

Re: Отслеживание линка на сетевухе

Непрочитанное сообщение daemon » 2009-12-21 13:05:24

Хм, не знаю даж...
Поясню всю ситуацию:
Есть УПС без интерфейсов, сервант домашний, поэтому не до проф железок. Ну и покупать для дома другой не имеет смысла. Схема такая:
[сервант] ---- [ADCL] ----тырнет
......| .............|
....[УПС] .........220
.....|
....220
:)
Отрубили питалово, сервант живет от упса, АДСЛ выключился - линк пропал.
Надо отследить и дать команду на выключение.
В биосе ПК настраиваем вкл при появлении питания.
:)

iye
ст. сержант
Сообщения: 360
Зарегистрирован: 2008-07-29 9:02:04

Re: Отслеживание линка на сетевухе

Непрочитанное сообщение iye » 2009-12-21 13:26:41

Линк какой ? И кто поднимает ? Если сам сервак нечто типа пппое то можно поставить в мпд даунлинк скрипт с каунтером на количество попаток. И например после 3 неудачных класть сервак.

Аватара пользователя
terminus
майор
Сообщения: 2305
Зарегистрирован: 2007-10-29 11:27:35
Откуда: Рига

Re: Отслеживание линка на сетевухе

Непрочитанное сообщение terminus » 2009-12-21 17:12:47

/etc/crontab

Код: Выделить всё

*/5 * * * *  root  /root/test.sh
/root/test.sh

Код: Выделить всё

#!/bin/sh
# esli na protjazhenii 5 minut interfeis ne UP, to TEST=5 i vipolnajem shutdown
TIME=0
TEST=0

while [ $TIME -ne 300 ]
do

ifconfig em0 | head -n 1 | grep UP > /dev/null

if [ $? -eq 1 ]
then
TEST=$(($TEST+1))
fi

sleep 60

TIME=$(($TIME+60))

done



if [ $TEST -eq 5 ]
then
shutdown -p now
fi
---

я там со скобками в while накасячил - исправил.
Последний раз редактировалось terminus 2009-12-21 18:21:18, всего редактировалось 2 раза.
Модель: AST-PM-105/0044; Тип: Универсальный, ремонтный; Название: Терминус; Род повреждения: Распад функций; Выводы: Сдать на слом.

daemon
рядовой
Сообщения: 34
Зарегистрирован: 2009-12-21 11:49:15

Re: Отслеживание линка на сетевухе

Непрочитанное сообщение daemon » 2009-12-21 17:30:55

Линк какой ? И кто поднимает ?
ADSL модем поднимает соединение, когда нет питалова на ADSL - нет линка, сервак от УПСа еще какое то время трепыхается. :).
terminus вот спасибо!
Сейчас опробую скрипт.

daemon
рядовой
Сообщения: 34
Зарегистрирован: 2009-12-21 11:49:15

Re: Отслеживание линка на сетевухе

Непрочитанное сообщение daemon » 2009-12-21 19:05:07

Не гаснет что-то, перенаправил вывод в файл powertest.log, отрубил подождал, подрубил глянул что в файле:

Код: Выделить всё

ifconfig re0 | head -n 1 | grep UP  >> /usr/local/etc/script/powertest.log

Код: Выделить всё

# less powertest.log 
re0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
re0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
re0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
re0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
re0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
re0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
re0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
re0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
re0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
re0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
re0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
re0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
re0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
т.е. UP как было :(

daemon
рядовой
Сообщения: 34
Зарегистрирован: 2009-12-21 11:49:15

Re: Отслеживание линка на сетевухе

Непрочитанное сообщение daemon » 2009-12-21 20:35:58

А вот messages замечательно говорит когда ап, когда даун

Код: Выделить всё

# less /var/log/messages | grep link
Dec 21 18:09:53  kernel: re0: link state changed to DOWN
Dec 21 18:16:59  kernel: re0: link state changed to UP
Dec 21 18:21:19  kernel: re0: link state changed to DOWN
Понял, надо скорее по status: active или status: no carrier отслеживать.

Аватара пользователя
terminus
майор
Сообщения: 2305
Зарегистрирован: 2007-10-29 11:27:35
Откуда: Рига

Re: Отслеживание линка на сетевухе

Непрочитанное сообщение terminus » 2009-12-21 21:34:26

Блин, ну да - че-то я лоханулся. Конечно же по status:

Код: Выделить всё

#!/bin/sh
# esli na protjazhenii 5 minut interfeis ne active, to TEST=5 i vipolnajem shutdown
TIME=0
TEST=0

while [ $TIME -ne 300 ]
do

ifconfig em0 | grep "status: active" > /dev/null

if [ $? -eq 1 ]
then
TEST=$(($TEST+1))
fi

sleep 60

TIME=$(($TIME+60))

done



if [ $TEST -eq 5 ]
then
shutdown -p now
fi
Модель: AST-PM-105/0044; Тип: Универсальный, ремонтный; Название: Терминус; Род повреждения: Распад функций; Выводы: Сдать на слом.


Аватара пользователя
Shuba
ст. сержант
Сообщения: 365
Зарегистрирован: 2008-03-25 10:58:21
Откуда: Минск
Контактная информация:

Re: Отслеживание линка на сетевухе

Непрочитанное сообщение Shuba » 2009-12-25 11:12:53

Вообщем данный скрипт я немного доработал:

Код: Выделить всё

#!/bin/sh
# Если на протяжении 5 минут интерфейс не активен, то TEST=5 и вырубаем комп
TIME=0
TEST=0

while [ $TIME -ne 300 ]
do
    ifconfig rl0 | grep "status: active" > /dev/null
    if [ $? -eq 1 ]
        then
            TEST=$(($TEST+1))
            echo `date '+%Y.%m.%d %H:%M:%S'`' Питание от батареи' >> /var/log/power.log
        fi
    sleep 60
    TIME=$(($TIME+60))
done

if [ $TEST -eq 5 ]
then
    echo `date '+%Y.%m.%d %H:%M:%S'`" Питание отсутствует 5 минут, компьютер выключается" >> /var/log/power.log
    shutdown -p now
fi
т.е. добавил 2 строки

Код: Выделить всё

echo `date '+%Y.%m.%d %H:%M:%S'`' Питание от батареи' >> /var/log/power.log
echo `date '+%Y.%m.%d %H:%M:%S'`" Питание отсутствует 5 минут, компьютер выключается" >> /var/log/power.log
После помещения в crontab имеем при работе от сети и работающем модеме:

Код: Выделить всё

2009.12.25 09:50:00 Питание от батареи
2009.12.25 09:51:00 Питание от батареи
2009.12.25 09:52:00 Питание от батареи
2009.12.25 09:53:00 Питание от батареи
2009.12.25 09:54:00 Питание от батареи
2009.12.25 09:55:00 Питание от батареи
2009.12.25 09:55:00 Питание отсутствует 5 минут, компьютер выключается
2009.12.25 09:56:00 Питание от батареи
2009.12.25 09:57:00 Питание от батареи
2009.12.25 09:58:00 Питание от батареи
2009.12.25 09:59:00 Питание от батареи
2009.12.25 10:00:00 Питание отсутствует 5 минут, компьютер выключается
2009.12.25 10:00:00 Питание от батареи
2009.12.25 10:01:00 Питание от батареи
2009.12.25 10:02:00 Питание от батареи
2009.12.25 10:03:00 Питание от батареи
2009.12.25 10:04:00 Питание от батареи
2009.12.25 10:05:00 Питание отсутствует 5 минут, компьютер выключается
2009.12.25 10:05:00 Питание от батареи
2009.12.25 10:06:00 Питание от батареи
хотя при запуске в консоли всё нормально (модем вырубать не получилось - находится на другом конце города), т.е. в кронтабе не правильно сроватывает данные строки:

Код: Выделить всё

ifconfig rl0 | grep "status: active" > /dev/null
    if [ $? -eq 1 ]
        then
            TEST=$(($TEST+1))
            echo `date '+%Y.%m.%d %H:%M:%S'`' Питание от батареи' >> /var/log/power.log
        fi
и

Код: Выделить всё

shutdown -p now
Сила ночи, сила дня - одинакова фигня!

Аватара пользователя
Shuba
ст. сержант
Сообщения: 365
Зарегистрирован: 2008-03-25 10:58:21
Откуда: Минск
Контактная информация:

Re: Отслеживание линка на сетевухе

Непрочитанное сообщение Shuba » 2009-12-25 13:46:05

Вообщем нашёл в чём были грабли. Окончательный вариант будет такой:

Код: Выделить всё

#!/bin/sh
# Если на протяжении 5 минут интерфейс не активен, то TEST=5 и вырубаем комп
TIME=0
TEST=0

while [ $TIME -ne 300 ]
do
    /sbin/ifconfig rl0 | grep "status: active" > /dev/null
    if [ $? -eq 1 ]
        then
            TEST=$(($TEST+1))
            echo `date '+%Y.%m.%d %H:%M:%S'`' Питание от батареи' >> /var/log/power.log
        fi
    sleep 60
    TIME=$(($TIME+60))
done

if [ $TEST -eq 5 ]
then
    echo `date '+%Y.%m.%d %H:%M:%S'`" Питание отсутствует 5 минут, компьютер выключается" >> /var/log/power.log
    /sbin/shutdown -p now
fi
Сила ночи, сила дня - одинакова фигня!

Аватара пользователя
terminus
майор
Сообщения: 2305
Зарегистрирован: 2007-10-29 11:27:35
Откуда: Рига

Re: Отслеживание линка на сетевухе

Непрочитанное сообщение terminus » 2009-12-25 13:49:42

Я ваш вариант проверил - у меня работает без проблем. В компе две сетивухи - одна подключена, а вторая нет. Если поставить проверку той что подключена то никаких сообщений и срабатываний, а если ту что не подключена то срабатывания. Вы правильную сетевуху указываете - может, не знаю - не rl0, а rl1 надо, типа...

К стати скрипт можно немного улучшить - выполнять не shutdown -p now а -h now (halt). Если еще в биосе выставить запуск при подаче питания, то тогда комп будет самостоятельно подыматься когда свет вернется. ;-)

Код: Выделить всё

#!/bin/sh
# Если на протяжении 5 минут (300 сек) интерфейс не активен, то TEST=5 (300/60) и вырубаем комп
# NIC - сетевой интерфейс который надо мониторить
# TIMEOUT - задержка в секундах перед выключением компьютера
NIC=rl0
TIMEOUT=300

###
PATH=/etc:/bin:/sbin:/usr/bin:/usr/sbin
MINUTES=$(($TIMEOUT/60))
TIME=0
TEST=0

while [ $TIME -ne $TIMEOUT ]
do
    ifconfig $NIC | grep "status: active" > /dev/null
    if [ $? -eq 1 ]
        then
            TEST=$(($TEST+1))
            echo `date '+%Y.%m.%d %H:%M:%S'`' Питание от батареи' >> /var/log/power.log
        fi
    sleep 60
    TIME=$(($TIME+60))
done

if [ $TEST -eq $MINUTES ]
then
    echo `date '+%Y.%m.%d %H:%M:%S'`" Питание отсутствует $MINUTES минут, компьютер выключается" >> /var/log/power.log
    shutdown -h now
fi
Модель: AST-PM-105/0044; Тип: Универсальный, ремонтный; Название: Терминус; Род повреждения: Распад функций; Выводы: Сдать на слом.

Аватара пользователя
Shuba
ст. сержант
Сообщения: 365
Зарегистрирован: 2008-03-25 10:58:21
Откуда: Минск
Контактная информация:

Re: Отслеживание линка на сетевухе

Непрочитанное сообщение Shuba » 2009-12-25 17:18:59

Ну так потому и не работало, что в первоначальном варианте не было

Код: Выделить всё

PATH=/etc:/bin:/sbin:/usr/bin:/usr/sbin
соответственно из-за того, что ifconfig и shutdown находятся в /sbin и этот путь при исполнении кроном не учитывается всё и не работало. Ща я уже запустил и протестил свой вариант, пашет ну ура!
Сила ночи, сила дня - одинакова фигня!