Использование watch для запуска сценария оболочки - но сценарий больше не работает
Поэтому я хочу следить за подключением к сети, чтобы составить отчет для своего интернет-провайдера. (кажется, модем гаснет примерно 30-60 секунд примерно раз в день)
Так что я скопировал этот удобный маленький скрипт
И работает это с
watch -n 15 ./ping-test.sh
Я проверял это, потянув за вилку на моем модеме.
Первый раз, когда watch запускает скрипт после выхода из сети, он работает нормально (отправляет электронное письмо), а затем перестает работать. Как только сеть восстановлена, скрипт "завершается", а затем watch запускает его снова.
Поэтому я получаю почту, когда сеть выходит из строя, но не как долго она была отключена.
Если я запускаю скрипт прямо из командной строки, он запускается (по электронной почте) и затем завершается.
Есть идеи почему? Как я могу заставить скрипт продолжать работать, когда сеть не работает?
4 ответа
ping будет зависать, если не сможет достичь своей цели, и, возможно, поэтому сценарий перестает функционировать, потому что ping все еще ожидает ответа. Попробуйте добавить в пинг параметр-w крайний срок или-W тайм-аут.
Ваше решение с командой 'watch' не подходит. Я хотел бы попытаться решить это с чем-то вроде этого:
#!/bin/bash
HOSTS="foo.bar foo2.bar"
COUNT=4
while :
do
for myHost in $HOSTS
do
count=$(ping -c $COUNT $myHost | grep 'received' | awk -F',' '{ print $2 }' | awk '{ print $1 }')
if [ $count -eq 0 ]; then
# 100% failed
echo "Host : $myHost is down (ping failed) at $(date)"
fi
done
sleep 15 # here is your refresh rate
done
и затем запустите его как обычный скрипт: ./script_name.sh
завершить с помощью CTRL+C.
Вы можете сделать это в режиме реального времени с помощью "ip monitor". Это будет выводить любые события, такие как удаление IP-адреса или добавление состояния связи, изменяющегося с рабочего на отключенное, или изменение маршрута каким-либо образом.
ip monitor all >> /some/log.log &
Вы должны открыть в режиме добавления. Если вы хотите оставить его для запуска за пределами терминала, вы можете просто отменить задание с помощью "disown %1"
Если вам тоже нужны временные метки, есть несколько способов. Самый простой способ - использовать inotifywait, чтобы проверить, получает ли файл обновление, и добавить к нему свою дату. Было бы легко сделать все вышеперечисленное и это в сценарии оболочки и, возможно, отказаться от этого, чтобы вы получили
ip monitor all >> /some/log.log &
while inotifywait -qq -e modify /some/log.log; do
sleep 0.2;
date >>/root/mon.log;
done
наслаждаться
Он перестает функционировать, потому что он уже завершен, но зависит от родительского процесса - watch
Команда, которая еще жива.
Поэтому я получаю почту, когда сеть выходит из строя, но не как долго она была отключена.
Этот скрипт уже печатает дату, когда удаленная система не работает:
echo "Host : $myHost is down (ping failed) at $(date)" | mail -s "$SUBJECT" $EMAILID
Как я могу заставить скрипт продолжать работать, когда сеть не работает?
это ping
с -c 1
поэтому он остановится после отправки 1 пакета ECHO_REQUEST.
Положите его в cron, чтобы запускать каждую минуту:
*/1 * * * * /path/to/your/script