2016-08-29 11 views
2

RHEL 7.1 - это ОС, на котором он будет использоваться.Сценарий Linux для мониторинга удаленного порта и запуска сценария, если он не удался

У меня есть два сервера, которые идентичны (A и B). Серверу B необходимо контролировать порт на сервере A, а если он отключен на 30 секунд, запустите скрипт. Я прочитал Netcat был заменен NCAT на RHEL 7, так это то, что я до сих пор:

#!/bin/bash 
Server=10.0.0.1 
Port=123 
ncat $Server $Port &> /dev/null; echo $? 

Если порт, вывод 0. Если порт вниз, выход 1. Я m просто не уверен, как сделать следующую часть, которая будет «если в течение 30 секунд, а затем запустить x скрипт»

Любая помощь будет оценена. Заранее спасибо.

+1

Рассматривали ли вы использование существующего инструмента для этого, вместо того чтобы кататься самостоятельно? –

+0

Если вы пытаетесь использовать общий виртуальный IP, например, это то, что [Pacemaker] (http://clusterlabs.org/wiki/Main_Page) для - и я обещаю ** вам это " сделаю намного лучшую работу, чем ваш маленький доморощенный сценарий. –

+3

HA полна угловых шкафов - один из самых веселых - это раздвоенный мозг, когда ваши системы не могут общаться друг с другом, но оба могут видеть внешний мир. Увы, эти угловые случаи действительно случаются, и если вы пишете что-то, не зная их, у них будет множество ошибок. –

ответ

1

Если вы действительно хотите, чтобы сценарий этого, а не с помощью специального инструмента, как Pacemaker, как @CharlesDuffy предложил, то вы могли бы сделать что-то вроде этого:

  • Выполнить бесконечный цикл
  • Проверьте порт
    • Если вверх, сохраните отметку времени
    • В противном случае проверьте отличия от последняя сохраненная метка времени
      • Если больше времени прошло, то порог, а затем запустить скрипт
  • Сон немного

Например:

#!/bin/bash 

server=10.0.0.1 
port=123 
seconds=30 

seen=$(date +%s) 
while :; do 
    now=$(date +%s) 
    if ncat $server $port &> /dev/null; then 
     seen=$now 
    else 
     if ((now - seen > seconds)); then 
      run-script && exit 
     fi 
    fi 
    sleep 1 
done 
+0

Это очень полезно.Я фактически перехожу к nmap для этого, но я все еще использую этот пример, чтобы сделать эту работу. – Ric

1
#!/bin/bash 
Server=10.0.0.1 
Port=123 
port_was_down=0 
while true; do 
    sleep 30 
    if ! ncat $Server $Port &> /dev/null; then 
     if [[ $port_was_down == "1" ]]; then 
      run-script 
      exit 
     else 
      port_was_down=1 
     fi 
    else 
     port_was_down=0 
    fi 
done 
+1

Это было полезно, спасибо за ваш вклад. – Ric

0

насчет используя nmap? что-то вроде:

TIMEOUT=30s; 
HOST=10.0.0.1; 
PORT=123; 
if nmap --max-rtt-timeout $TIMEOUT --min-rtt-timeout $TIMEOUT -p $PORT $HOST | grep "^$PORT.*open"; then 
    echo 'OPEN'; 
else 
    echo 'CLOSED'; 
fi;