Использую watch для запуска скрипта оболочки, но скрипт перестает работать

Использую 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 запускает его снова.

Поэтому я получаю почту о времени отключения сети, но не о том, как долго она была отключена.

Если я запускаю скрипт прямо из командной строки, он запускается (отправляет письма) и затем завершает работу.

Есть идеи почему? Как мне заставить скрипт продолжать работать после отключения сети?

решение1

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

решение2

Вы можете сделать это в реальном времени с помощью "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

Наслаждаться

решение3

Ваше решение с командой '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.

решение4

Он прекращает свое существование, поскольку уже завершен, но зависит от родительского процесса — 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

Связанный контент