Запуск и удержание кластера

(Оригинал написан для linuxetc.ru) Считается, что после установления соединения по VPN соответствующие демоны, например, ipsec, сами обрабатывают исключительные ситуации типа внезапного пропадания коннекта и восстанавливают соединение при необходимости. На практике же картина не столь радужна и приходится применять "ручные" средства контроля связности VPN и её восстановления. Одно из возможных решений описано ниже. Скрипт /usr/local/sbin/check_vpn:
#!/bin/bash # проверяем, не запущен ли другой экземпляр скрипта... [ -z $CRONTAB ] && echo "Проверка на дубль" [[ "2" -ne `ps aux | grep -c check_vpn` ]] && exit # проверяем наличие интернета -- пытаемся получить страницу ya.ru [ -z $CRONTAB ] && echo "Проверка интернета" if [[ '0' -eq `wget --quiet --timeout=10 --tries=2 -O - ya.ru| grep -c 'http://www.yandex.ru/yandsearch'` ]]; then exit fi # проверяем наличие vpn -- пытаемся пинговать vpn-овский ip [ -z $CRONTAB ] && echo "Проверка vpn" if [[ '0' -ne `ping -c 10 192.168.99.99 | grep -c ttl` ]]; then exit fi # насколько можно судить, в этот момент vpn отсутствует echo "VPN отсутствует! Пытаюсь поднять..." source /usr/local/sbin/restart_vpn
...проверка [ -z $CRONTAB ] в скрипте служит для вывода сообщений при запуске из комстроки. Скрипт /usr/local/sbin/restart_vpn:
#!/bin/bash # полный останов всех служб vpn /usr/sbin/vserver mainvshost stop /etc/init.d/ipsec stop /etc/init.d/ipsec zap # бывает, что "залипает" в started статусе... /sbin/ifconfig ipsec0 down /etc/init.d/heartbeat stop /etc/init.d/drbd stop sleep 30 # для подстраховки подождём... #начинаем поднимать обратно... # после запуска ipsec таймаут обязателен, иначе drbd неправильно стартует /etc/init.d/ipsec start sleep 40 # этот роутинг нужен только у меня в сети, иначе местные служебные сервера не видны /sbin/route add -net 192.168.4.0 netmask 255.255.255.240 gw 192.168.5.7 /etc/init.d/drbd start sleep 10 /etc/init.d/heartbeat start
Выдержка из crontab -l :
CRONTAB=1 */1 * * * * /usr/local/sbin/check_vpn