Использование watch для запуска сценария оболочки - но сценарий больше не работает

Поэтому я хочу следить за подключением к сети, чтобы составить отчет для своего интернет-провайдера. (кажется, модем гаснет примерно 30-60 секунд примерно раз в день)

Так что я скопировал этот удобный маленький скрипт

http://www.cyberciti.biz/tips/simple-linux-and-unix-system-monitoring-with-ping-command-and-scripts.html

И работает это с

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
Другие вопросы по тегам