Измените сценарий оболочки для мониторинга/пинга нескольких IP-адресов.

Итак, мне нужно постоянно контролировать несколько маршрутизаторов и компьютеров, чтобы убедиться, что они остаются в сети. Я нашел отличный скрипт здесь, который будет уведомлять меня через рычание (так что я могу получать мгновенные уведомления на свой телефон), если один IP-адрес не может быть пропингован. Я пытался изменить сценарий для проверки связи с несколькими адресами, но безуспешно. У меня возникли проблемы с попыткой выяснить, как пропинговать отключенный сервер, в то время как скрипт продолжает следить за онлайн-серверами. любая помощь будет принята с благодарностью. Я не делал много сценариев оболочки, так что это совершенно новое для меня.

Спасибо

#!/bin/sh

#Growl my Router alive!
#2010 by zionthelion73 [at] gmail . com
#use it for free
#redistribute or modify but keep these comments
#not for commercial purposes

iconpath="/path/to/router/icon/file/internet.png"
# path must be absolute or in "./path" form but relative to growlnotify position
# document icon is used, not document content

# Put the IP address of your router here
localip=192.168.1.1

clear
echo 'Router avaiability notification with Growl'

#variable
avaiable=false

com="################"
#comment prefix for logging porpouse

while true;
do
if $avaiable
then
  echo "$com 1) $localip avaiable $com"
  echo "1"
  while ping -c 1 -t 2 $localip
    do
      sleep 5
    done
  growlnotify  -s -I $iconpath -m "$localip is offline"
  avaiable=false
else
  echo "$com 2) $localip not avaiable $com"
  #try to ping the router untill it come back and notify it
  while !(ping -c 1 -t 2 $localip)
  do
   echo "$com trying.... $com"
   sleep 5
  done

  echo "$com found $localip $com"
  growlnotify -s -I $iconpath -m "$localip is online"
  avaiable=true
fi

sleep 5

done

person Alex    schedule 16.01.2011    source источник


Ответы (4)


Самый простой подход — обернуть этот скрипт другим, создающим N процессов. Предположим, ваш скрипт называется "watchip", затем поместите в другой скрипт текст

watchip 10.0.1.1 &
watchip 10.0.1.2 &
watchip 10.0.1.3 &
etc

и установите localip на $1 внутри watchip.

person Martin v. Löwis    schedule 16.01.2011

Я не думаю, что нужно запускать несколько скриптов. Вот общий сценарий для мониторинга списка IP-адресов и отслеживания изменений в успешности ping...

#!/bin/bash
set 10.0.0.1 10.0.0.2 # etc
trap exit 2
while true; do
  i=1
  for ipnumber in "$@"; do
    statusname=up$i
    laststatus=${!statusname:-0}
    ping -c 1 -t 2 $ipnumber > /dev/null
    ok=$?
    eval $statusname=$ok
    if [ ${!statusname} -ne $laststatus ]; then
      echo status changed for $ipnumber
      if [ $ok -eq 0 ]; then
        echo now it is up
      else
        echo now it is down
      fi
    fi
    i=$(($i + 1))
  done
  sleep 5
done
person DigitalRoss    schedule 16.01.2011
comment
спасибо, но мне нужно знать, онлайн ли он в автономном режиме, а не просто ли он изменился с одного статуса на другой. приведет ли несколько сценариев к значительному увеличению использования ресурсов? - person Alex; 17.01.2011
comment
См. мой ответ для аналогичной техники с использованием массивов. - person Dennis Williamson; 17.01.2011
comment
@Alex: Хорошо, хорошо, я изменил сценарий, чтобы вы могли увидеть, как проверить вверх или вниз. Но в какой-то момент вам просто придется читать man bash. Проблема с запуском нескольких сценариев в фоновом режиме заключается не в потреблении ресурсов, а в сложности. Это уродливо, их будет раздражать проверять и убивать, вы не можете легко регистрировать их вывод, их сложно отлаживать и т. д. и т. д. - person DigitalRoss; 17.01.2011
comment
вау, это здорово, большое спасибо. хотя я не могу понять, как проверить ONLINE ip, а также OFFLINE ip при запуске. он просто отображает те, которые находятся в автономном режиме. пока он не перейдет в автономный режим, он не будет отображать, что он в сети. - person Alex; 17.01.2011
comment
Хорошо, это может потребовать многого, но я также хочу задницу по IP-именам (например, подвал маршрутизатора, компьютер 1 и т. Д.). Я думаю, что могу просто придерживаться нескольких сценариев, если это сложно. еще раз спасибо - person Alex; 17.01.2011

Измените localip=192.168.1.1 на:

localip=$1

Это позволяет передавать IP-адрес в качестве аргумента командной строки. Затем вы можете запустить несколько копий скрипта, передавая разные IP-адреса. Затем вы можете создать основной сценарий для запуска нескольких копий сценария мониторинга. Предполагая, что опубликованный вами сценарий - monitor.sh:

#!/bin/sh

monitor.sh 192.168.1.1 &
monitor.sh 192.168.2.2 &
monitor.sh 192.168.3.3 &
wait
person John Kugelman    schedule 16.01.2011

Держите два массива. Один с доступными IP-адресами; другой с недоступными. Когда их статус изменится, переместите их в другой массив. Нет необходимости в нескольких фоновых процессах.

Я пропустил запись. Вы можете добавить его обратно. Это непроверенный код.

available=(192.168.1.1 192.168.1.2 192.168.1.3 192.168.1.4)
unavailable=()

while true
do
    for index in ${!available[@]}
    do
        if ! ping -c 1 -t 2 ${available[index]}
        then
            growlnotify  -s -I $iconpath -m "${available[index]} is offline"
            unavailable+=(${available[index]})
            unset "available[index]"
        fi
    done

    for index in ${!unavailable[@]}
    do
        if ping -c 1 -t 2 ${unavailable[index]}
        then
            growlnotify  -s -I $iconpath -m "${unavailable[index]} is back online"
            available+=(${unavailable[index]})
            unset "unavailable[index]"
        fi
    done
done
person Dennis Williamson    schedule 16.01.2011
comment
Я не уверен, что происходит, никаких уведомлений, он просто останавливается, после второго пинга с выводом: введите описание уведомления, затем новую строку, а затем Ctrl-D (конец файла). Для отмены нажмите Ctrl-C. - person Alex; 17.01.2011
comment
@Alex: Вероятно, это потому, что я не включил часть кода из вашего оригинала. В дополнение к коду, связанному с ведением журнала, я не установил переменную iconpath, которая, вероятно, вызывает ошибку. Кроме того, вы можете перенаправить вывод ping: ping ... > /dev/null. - person Dennis Williamson; 17.01.2011