2011-01-16 3 views
1

Хорошо, поэтому мне нужно постоянно контролировать несколько маршрутизаторов и компьютеров, чтобы они оставались в сети. Я нашел отличный скрипт here, который будет уведомлять меня через growl (так что я могу получать мгновенные уведомления на своем телефоне), если один ip не может быть pinged. Я пытаюсь изменить скрипт на несколько адресов с небольшим количеством удачи. У меня возникли проблемы с попыткой выяснить, как пинговать вниз сервер, пока скрипт продолжает смотреть онлайн-серверы. любая помощь будет принята с благодарностью. Я не делал много сценариев оболочки, так что это для меня совершенно новое.Измените сценарий оболочки для контроля/ping нескольких 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 

ответ

1

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

watchip 10.0.1.1 & 
watchip 10.0.1.2 & 
watchip 10.0.1.3 & 
etc 

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

+0

Спасибо, миллион, это отлично работает. – Alex

0

Изменить 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 
0

Я не думаю, что это необходимо для запуска нескольких сценариев. Вот общий сценарий для отслеживания списка 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 "[email protected]"; 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 
+0

спасибо, но мне нужно знать, что он онлайн в автономном режиме, если он просто изменился с одного статуса на другой. будет ли многократный сценарий причиной значительного увеличения использования ресурсов? – Alex

+0

См. Мой ответ для аналогичной техники с использованием массивов. –

+0

@Alex: Хорошо, хорошо, я изменил сценарий, чтобы вы могли видеть, как проверить или понизить. Но в какой-то момент вам просто нужно будет прочитать «man bash». Проблема с запуском нескольких сценариев в фоновом режиме - это не потребление ресурсов, а сложность. Это уродливо, они будут раздражать, чтобы проверять и убивать, вы не можете легко записывать их результаты, их трудно отлаживать и т. Д. – DigitalRoss

0

Храните два массива. Один с доступными 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 
+0

Я не уверен, что происходит, никаких уведомлений он просто не останавливается после второго пинга с выходом: «Введите описание уведомления, а затем новую строку, а затем Ctrl-D (Конец файла). , нажмите Ctrl-C. " – Alex

+0

@Alex: Вероятно, потому, что я не включил часть кода из вашего оригинала.В дополнение к коду, связанному с протоколированием, я не установил переменную 'iconpath', которая, вероятно, вызывает ошибку. Кроме того, вы можете перенаправить вывод 'ping':' ping ...>/dev/null'. –

 Смежные вопросы

  • Нет связанных вопросов^_^