Стоит такая задача.

Есть два шлюза, один основной, на SUSE, второй резервный
(простой железный роутер), необходимо обеспечить
автоматическое переключение в случаи падения основного и обратное когда
поднимется.Клиенты не должны предпринимать никаких действий.

Есть одна важная тонкость. На шлюзе поднят openVPN с другим оффисом,
нужно чтобы он работал. И нужно другому оффису тоже как-то автоматически
сообщить о смене ip/порта.

---------

Как сделать просто переключение в принципе представляю, гугл полон
подобными решениями, а вот как ещё и VPN поднимать, пока вообще в голову не
возьму.

Спасибо, Вы очень любезны.

2

перепрошить роутер железный? Пробовали капать в эту сторону?

MX 23.6 Libretto x86_64
Чем больше я работаю админом, тем больше понимаю, насколько волшебна фраза - "Нет технической возможности!"

Имхо не вариант. Там дещёвка, он на случай войны, подключен к другому прову.

Кое-что накопал.. и такой вопрос. При смене интерфейсов, Vpn достаточно будет перезапустить и он за работает по маршруту который в данный момент?

Спасибо, Вы очень любезны.

Помучил гугл. Вот такой вариант больше всего нравится http://sys-adm.org.ua/net/routing.php

2 вопроса: вот это

 # iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j MASQUERADE

в какой файл пишется?

И

Сергей В. пишет:

При смене интерфейсов, Vpn достаточно будет перезапустить и он за работает по маршруту который в данный момент?

Спасибо, Вы очень любезны.

5 (19.01.2012 13:08:57 отредактировано Сергей В.)

 Консоль:
#!/bin/bash
gw1=первый
gw2=второй
#site='google.ru'
log='/var/log/check_gateway.log'

current=$(route -n | tail -1 | awk '{print $2}'); # Проверяем маршрут по умолчанию
if ping -c 4 $gw1 > /dev/null 2>&1; # Пингуем инет
then
if [ $gw1 = $current ]
then
exit 0
else
route del default 2> /dev/null
route add default gw $gw1
echo "Работает основной канал" >> $log
exit 0
fi
else
if [ $gw2=$current ]
then
exit 0
else
route del default 2> /dev/null;
echo "Внимание! Произошло падение основного канала!" >> $log
route add default gw $gw2
echo "Внимание!Работает резервный канал!" >> $log
fi
fi

вот скриптик, работает, но вопрос, как его зациклить в bash? в sh вот такой вариант http://sys-adm.org.ua/net/routing.php . Команды будут отличаться?

Спасибо, Вы очень любезны.

Я понимаю что нужно сделать 2 функции, вопрос лишь в том, что синтаксис в данном случае не будет различаться с sh?

Спасибо, Вы очень любезны.

7 (19.01.2012 13:23:24 отредактировано Сергей В.)

 Консоль:
#!/bin/bash
gw1=первый
gw2=второй
check_period="30s"
#site='google.ru'
log='/var/log/check_gateway.log'
start_function ()
{
current=$(route -n | tail -1 | awk '{print $2}'); # Проверяем маршрут по умолчанию
if ping -c 4 $gw1 > /dev/null 2>&1; # Пингуем инет
then
if [ $gw1 = $current ]
then
exit 0
else
route del default 2> /dev/null
route add default gw $gw1
echo "Работает основной канал" >> $log
exit 0
fi
else
if [ $gw2=$current ]
then
exit 0
else
route del default 2> /dev/null;
echo "Внимание! Произошло падение основного канала!" >> $log
route add default gw $gw2
echo "Внимание!Работает резервный канал!" >> $log
fi
fi
}
while
do
start_function
sleep ${check_period}
done

Так правильно? проверять на данный момент нет возможности

Спасибо, Вы очень любезны.

8 (19.01.2012 13:48:23 отредактировано Сергей В.)

конкретно боюсь за цикл

 Консоль:
while
do
start_function
sleep ${check_period}
done

я скобки не ставил бы это правильно?

Спасибо, Вы очень любезны.

9

Сергей В. пишет:

Так правильно? проверять на данный момент нет возможности

читать очень сложно без отступов. Поставьте себе нормальный редактор вроде kate.

Сергей В. пишет:

я скобки не ставил бы это правильно?

конечно правильно. В качестве скобок тут do & done. Фигурные скобки в bash'е ставятся только
1. для ограничения функций
2. для ограничения переменных (их имени. Например вот так пишется переменная X, и сразу после неё Y: ${X}Y )
3. для подстановок-перечислений, вроде echo {1..10}
Круглые скобки почти всегда используются для создания отдельного процесса. например

 Консоль:
$ ( cd SOURCE; tar -cf - ) | ( cd TARGET; tar -xf - )

здесь одновременно работают три процесса - родительский, первый дочерний, который упаковывает файлы в поток, и второй дочерний, который этот поток сразу-же распаковывает. При этом каждый из tar'ов работает в своём собственном рабочем каталоге.

Карусель разнесло по цепочке за час
Всех известий — конец
Да, весна началась!
(всё к лицу подлецу, как родному отцу, не рассказывай, батя, и так всё пройдёт)

10

Сергей В. пишет:

[$gw2=$current]

здесь ошибка.

Пожалуйста 2 простых правила:
1. пробелы в bash'е (не) ставят не только и не столько для красоты, они служат разделителем.  Вы пробелов не поставили, потому $gw2=$current это ОДНА лексема. А [ ждёт три. (точнее 4 - ещё закрывающую скобку). Правильно так

[ $gw2 = $current ]

тут команда [ получила свои 4 лексемы, как и ожидала.
2. А если какая-то переменная пуста? Мы опять получаем не 4 лексемы, а меньше(или наоборот больше, если в переменных есть пробелы, и они не пусты, или получим неверный результат, ибо 2 пробела равны одному). Используйте двойные кавычки:

[ "$gw2" = "$current" ]

Вот это уже вполне рабочая команда. Ещё лучше юзать одиночные, но в них переменные не работают ($ воспринимается как обычный знак)

Из правила 1 есть исключение, которое только подтверждает правило. Это инициализация. Она пишется одной лексемой, без всяких пробелов. Ибо единая конструкция. И без начального $, ибо тут не значение переменной используется, а только её имя. Значение теряется.

Если не получается воспользоваться правилом 2 - используйте конкатенацию строк - две строки записанные слитно воспринимаются как единая лексема:

echo '!$'"$VARIABLE"'$!'

тут сцепка трёх строк слитно. Это одна лексема - строка.

Сергей В. пишет:

exit 0

1. сама структура программы непродуманная. Нарисуйте блок-схему что-ли... Зачем тут вообще exit?
2. exit 0 нужно писать тогда, и только тогда, когда вы ЛЮТО, БЕШЕНО УВЕРЕНЫ, что надо именно 0. Вы уверены? Тогда ничего не пишите. А вдруг не ноль?
Вообще выходить из подпрограммы по exit - моветон. Выходить надо по коду возврата. Кстати о кодах возврата:
0..63 зарезервированы за системой. Системные утилиты возвращают коды с таким значением.
128..255 возвращаются тогда, когда программа была прервана. Код зависит от прервавшего сигнала. (можно по нему понять, было-ли это делением на ноль, или скажем CTRL+C).
вам остаются коды 64..127 Ну и код 0 конечно == "всё хорошо".

Сергей В. пишет:

while

тут тоже ошибка - while это оператор проверки условия, ему нужна ещё одна лексема - для проверки. Например можно написать так

while true
do
# ...
done

Если цикл у вас вправду бесконечный. (хотя вообще говоря он конечный, ибо часто требуется ещё и корректно положить Сеть, а не только её переключать. При завершении работы.)

Карусель разнесло по цепочке за час
Всех известий — конец
Да, весна началась!
(всё к лицу подлецу, как родному отцу, не рассказывай, батя, и так всё пройдёт)

Спасибо огромное, буду править

Спасибо, Вы очень любезны.

12 (20.01.2012 15:22:33 отредактировано Сергей В.)

 Консоль:
#!/bin/bash
gw1=****; # Основной шлюз
gw2=****; # Резервный шлюз
check_period="30s"; # Периодичность запуска скрипта
log='/var/log/check_gateway.log'; # Путь к файлу логов
# Собственно сама функция проверки и переключения на резерв и обратно
start_function ()
{
current=$(route -n | tail -1 | awk '{print $2}'); # Проверяем маршрут по умолчанию
if ping -c 4 $gw1 > /dev/null 2>&1; # Пингуем инет
then
  if [ $gw1 = $current ]; # Если используется основной шлюз, то выходим
  then
  return
  else; # Если же нет то
   route del default > /dev/null; # Сбрасываем резервный маршрут
   route add default gw $gw1; # Прописываем основной
   echo "Работает основной канал" >> $log
   date >> $log
   return; # Выходим
  fi
else; # Если основной шлюз не доступен то
  if [ $gw2 = $current ]; # Проверяем установлен ли резервный маршрут
  then
  return
else; # Если нет, то устанавливаем
route del default > /dev/null; # Сбрасываем основной маршрут
echo "Внимание! Произошло падение основного канала!" >> $log
route add default gw $gw2; # Прописываем резервный
echo "Внимание!Работает резервный канал!" >> $log
date >> $log
  fi
fi
}
while true; # Зацикливаем скрипт с паузой.
do
start_function
sleep $check_period
done

так будет работать?
Прошу прощения, просто я не программист ни разу.. но учусь.

И ещё.. чисто эстетика

 Консоль:
check_period="30s"
log='/var/log/check_gateway.log'

Какие кавычки можно ставить, или вообще не ставить?

Спасибо, Вы очень любезны.

13 (20.01.2012 15:24:43 отредактировано Сергей В.)

drBatty пишет:

читать очень сложно без отступов

Я сам под вендой сижу (работа)а к никсу подключаюсь через putty, вам даю вывод команды cat

Спасибо, Вы очень любезны.

14

Сергей В. пишет:

  if [ $gw1 = $current ]; # Если используется основной шлюз, то выходим

вот здесь нужны "двойные кавычки".

Сергей В. пишет:

check_period="30s"
log='/var/log/check_gateway.log'
Какие кавычки можно ставить, или вообще не ставить?

1. лучше всего ставить одиночные 'кавычки'. Информация в них никак не обрабатывается, и поступает "как есть". Все символы, кроме самой одиночной кавычки.

2. К сожалению, часто надо вставить в строчку переменную. Это невозможно в одиночных кавычках (т.к. $ считается простым символом). Тогда используют двойные. Однако следует учесть, что внутри двойных кавычек раскрывается не только $, но и многие другие спец-символы. Вот доставляющий пример в интерактивном режиме:

 Консоль:
$ ping ya.ru
# пингуется...
$ echo "Hello World!!!"
echo "Hello Worldping ya.ru"
Hello Worldping ya.ru

Дело в том, что "!" это тоже специальный символ, и он тоже раскрывается. Потому "программа" работает совсем не так, как ожидается.

3. можно совсем не использовать кавычек, и это даже работает. При этом надо помнить, что каждой команде bash'а нужен определённый набор лексем, и о том, что специальные символы bash будет раскрывать по своему. Из этого следует, что если ваш скрипт печатает что угодно, то и делать он будет что угодно. Что угодно составителю текста. Если это какой-нить простой текст, то скорее всего будет сообщение об ошибке, иначе - РЕШЕТО.

Сергей В. пишет:

Я сам под вендой сижу (работа)а к никсу подключаюсь через putty, вам даю вывод команды cat

вы лучше скачайте файл, поправьте его в notepad++, и залейте обратно. Если нет аллергии к консоли - используйте FAR manager. Он ЕМНИП тоже умеет SSH. Там же можно копировать, и отступы сами расставляются. И подсветка, которая ловит 95% глупых ошибок (которых лично у меня было Over9000 первое время).

Карусель разнесло по цепочке за час
Всех известий — конец
Да, весна началась!
(всё к лицу подлецу, как родному отцу, не рассказывай, батя, и так всё пройдёт)

15 (25.01.2012 18:52:09 отредактировано Сергей В.)

 Консоль:
#!/bin/bash
gw1=top secret; # Основной шлюз
gw2=top secret; # Резервный шлюз
check_period='30s'; # Периодичность запуска скрипта
log='/var/log/check_gateway.log'; # Путь к файлу логов
# Собственно сама функция проверки и переключения на резерв и обратно
start_function ()
{
current=$(route -n | tail -1 | awk '{print $2}'); # Проверяем маршрут по умолчанию
if ping -c 4 $gw1 > /dev/null 2>&1; # Пингуем инет
then
  if [ $gw1 = $current ]; # Если используется основной шлюз, то выходим
  then
  return
  else; # Если же нет то
   route del default > /dev/null; # Сбрасываем резервный маршрут
   route add default gw $gw1; # Прописываем основной
   echo "Работает основной канал" >> $log
   date >> $log
   return; # Выходим
  fi
else; # Если основной шлюз не доступен то
  if [ $gw2 = $current ]; # Проверяем установлен ли резервный маршрут
  then
  return
else; # Если нет, то устанавливаем
route del default > /dev/null; # Сбрасываем основной маршрут
echo "Внимание! Произошло падение основного канала!" >> $log
route add default gw $gw2; # Прописываем резервный
echo "Внимание!Работает резервный канал!" >> $log
date >> $log
  fi
fi
}
while true; # Зацикливаем скрипт с паузой.
do
start_function
sleep $check_period
done

Выкладываю окончательный вариант скрипта (хотя не совсем ))) )
Ну как? Будет работать?

Спасибо, Вы очень любезны.

16

Сергей В. пишет:

Выкладываю окончательный вариант скрипта (хотя не совсем ))) )
Ну как? Будет работать?

не знаю. ну вышлите мне денег на ещё одного провайдера - попробую. Мне дома одного хватает  wink
в любом случае, для тестирования, следует заменить >> $log на tee --append log
что-бы лог писался И в лог, И в консоль.

Карусель разнесло по цепочке за час
Всех известий — конец
Да, весна началась!
(всё к лицу подлецу, как родному отцу, не рассказывай, батя, и так всё пройдёт)

 Консоль:

#!/bin/bash
gw1=194.186.251.137; # Основной шлюз
gw2=192.168.10.4; # Резервный шлюз
check_period='30s'; # Периодичность запуска скрипта
log='/var/log/check_gateway.log'; # Путь к файлу логов
# Собственно сама функция проверки и переключения на резерв и обратно
start_function ()
{
current=$(route -n | tail -1 | awk '{print $2}'); # Проверяем маршрут по умолчанию
if ping -c 4 $gw1 > /dev/null 2>&1; # Пингуем инет
then
  if [ $gw1 = $current ]; # Если используется основной шлюз, то выходим
   then
   return
   else
    route del default > /dev/null; # Сбрасываем резервный маршрут
    route add default gw $gw1; # Прописываем основной
    echo "Работает основной канал" >> $log
    date >> $log
    return; # Выходим
fi
  else
   if [ $gw2 = $current ]; # Проверяем установлен ли резервный маршрут
    then
    return
    else
     route del default > /dev/null; # Сбрасываем основной маршрут
     echo "Внимание! Произошло падение основного канала!" >> $log
     route add default gw $gw2; # Прописываем резервный
     echo "Внимание!Работает резервный канал!" >> $log
     date >> $log
   fi
fi
}
while true; # Зацикливаем скрипт с паузой.
do
start_function
sleep $check_period
done

Вот так работает, но буду ещё допиливать. Надо VPN поднимать и ещё койчего не нравтся

Спасибо, Вы очень любезны.

В результате тестирования выявлен существенный недостаток.

Если основной шлюз недоступен, то каждые 30 сек скрипт сбрасывает резервный маршрут, а потом снова его прописывает. И получается, что резервный инет работает через "пень-колоду"..

Спасибо, Вы очень любезны.

19 (25.02.2012 14:52:03 отредактировано Сергей В.)

Получается что не работает эта конструкция

#!/bin/bash
gw1=194.186.251.137; # Основной шлюз
gw2=192.168.10.4; # Резервный шлюз
check_period='30s'; # Периодичность запуска скрипта
log='/var/log/check_gateway.log'; # Путь к файлу логов
# Собственно сама функция проверки и переключения на резерв и обратно
start_function ()
{
current=$(route -n | tail -1 | awk '{print $2}'); # Проверяем маршрут по умолчанию
if ping -c 4 $gw1 > /dev/null 2>&1; # Пингуем инет
then

  if [ $gw1 = $current ]; # Если используется основной шлюз, то выходим
   then
   return
   else
    route del default > /dev/null; # Сбрасываем резервный маршрут
    route add default gw $gw1; # Прописываем основной
    echo "Работает основной канал" >> $log
    date >> $log
    return; # Выходим
fi
else
   if [ $gw2 = $current ]; # Проверяем установлен ли резервный маршрут
    then
    return

    else
     route del default > /dev/null; # Сбрасываем основной маршрут
     echo "Внимание! Произошло падение основного канала!" >> $log
     route add default gw $gw2; # Прописываем резервный
     echo "Внимание!Работает резервный канал!" >> $log
     date >> $log
   fi
fi

Спасибо, Вы очень любезны.

И кстати.. простите за тупой вопрос, но как скрипт остановить??

kill check_gateways не прокатил

Спасибо, Вы очень любезны.

Кажется нашёл причину.

Я для проверки просто ронял интерфейс подключённый к пчелайну, но шлюз  пингуется (хоть и через другого прова), у него внешний ip. Короче буду дальше думать.

Спасибо, Вы очень любезны.

22

Сергей В. пишет:

В результате тестирования выявлен существенный недостаток.

1. приведите в порядок отступы - ВСЁ, что после if и до fi должно быть на один отступ правее. Я не понял логику вашего скрипта.
2.

Сергей В. пишет:

return; # Выходим

А где fi? Да и вообще - зачем так делать-то?

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

Сергей В. пишет:

И кстати.. простите за тупой вопрос, но как скрипт остановить??

послать сигнал остановки.

Сергей В. пишет:

kill check_gateways не прокатил

kill принимает номер сигнала и номер процесса.

Карусель разнесло по цепочке за час
Всех известий — конец
Да, весна началась!
(всё к лицу подлецу, как родному отцу, не рассказывай, батя, и так всё пройдёт)

23

Сергей В. пишет:

Я для проверки просто ронял интерфейс подключённый к пчелайну, но шлюз  пингуется (хоть и через другого прова), у него внешний ip

использовать ping для проверки работы шлюзов - вообще плохая идея.

Карусель разнесло по цепочке за час
Всех известий — конец
Да, весна началась!
(всё к лицу подлецу, как родному отцу, не рассказывай, батя, и так всё пройдёт)

24

Сергей В. пишет:

Кажется нашёл причину.

Я для проверки просто ронял интерфейс подключённый к пчелайну, но шлюз  пингуется (хоть и через другого прова), у него внешний ip. Короче буду дальше думать.

У меня была проблема такого рода ток смотрите:
Пакет шол так 62.33.188.11x -> 62.33.188.20x -> 192.168.200.1 -> 192.168.4.1 -> 192.168.4.100 -> Служба видит что у клиента 62.33.188.11x
Отправлял обратно так.
192.168.4.100 -> 192.168.4.1 -> 62.33.188.11x потому что на шлюзе был инет тоже то есть пакеты возвращались через другой канал.
Выход:
Создал таблицу через iproute2
настроил маршруты в данной таблицы.
Через iptables в PREROUTING ставил MARK 2 с ип 192.168.4.100 и уже после чего пакеты шли как мне надо.
В вашем случае если хотите использовать ping можете использовать таблицы iproute2.

Ищу дополнительный заработок (удалёнка).
Пьянка без секса – признак алкоголизма.

25

И ещё раз пишите daemon так возьмите за основу skeleton


user@router:/etc/init.d$ cat skeleton 
#! /bin/sh
### BEGIN INIT INFO
# Provides:          skeleton
# Required-Start:    $remote_fs $syslog
# Required-Stop:     $remote_fs $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Example initscript
# Description:       This file should be used to construct scripts to be
#                    placed in /etc/init.d.
### END INIT INFO

# Author: Foo Bar <foobar@baz.org>
#
# Please remove the "Author" lines above and replace them
# with your own name if you copy and modify this script.

# Do NOT "set -e"

# PATH should only include /usr/* if it runs after the mountnfs.sh script
PATH=/sbin:/usr/sbin:/bin:/usr/bin
DESC="Description of the service"
NAME=daemonexecutablename
DAEMON=/usr/sbin/$NAME
DAEMON_ARGS="--options args"
PIDFILE=/var/run/$NAME.pid
SCRIPTNAME=/etc/init.d/$NAME

# Exit if the package is not installed
[ -x "$DAEMON" ] || exit 0

# Read configuration variable file if it is present
[ -r /etc/default/$NAME ] && . /etc/default/$NAME

# Load the VERBOSE setting and other rcS variables
. /lib/init/vars.sh

# Define LSB log_* functions.
# Depend on lsb-base (>= 3.0-6) to ensure that this file is present.
. /lib/lsb/init-functions

#
# Function that starts the daemon/service
#
do_start()
{
    # Return
    #   0 if daemon has been started
    #   1 if daemon was already running
    #   2 if daemon could not be started
    start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON --test > /dev/null \
        || return 1
    start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON -- \
        $DAEMON_ARGS \
        || return 2
    # Add code here, if necessary, that waits for the process to be ready
    # to handle requests from services started subsequently which depend
    # on this one.  As a last resort, sleep for some time.
}

#
# Function that stops the daemon/service
#
do_stop()
{
    # Return
    #   0 if daemon has been stopped
    #   1 if daemon was already stopped
    #   2 if daemon could not be stopped
    #   other if a failure occurred
    start-stop-daemon --stop --quiet --retry=TERM/30/KILL/5 --pidfile $PIDFILE --name $NAME
    RETVAL="$?"
    [ "$RETVAL" = 2 ] && return 2
    # Wait for children to finish too if this is a daemon that forks
    # and if the daemon is only ever run from this initscript.
    # If the above conditions are not satisfied then add some other code
    # that waits for the process to drop all resources that could be
    # needed by services started subsequently.  A last resort is to
    # sleep for some time.
    start-stop-daemon --stop --quiet --oknodo --retry=0/30/KILL/5 --exec $DAEMON
    [ "$?" = 2 ] && return 2
    # Many daemons don't delete their pidfiles when they exit.
    rm -f $PIDFILE
    return "$RETVAL"
}

#
# Function that sends a SIGHUP to the daemon/service
#
do_reload() {
    #
    # If the daemon can reload its configuration without
    # restarting (for example, when it is sent a SIGHUP),
    # then implement that here.
    #
    start-stop-daemon --stop --signal 1 --quiet --pidfile $PIDFILE --name $NAME
    return 0
}

case "$1" in
  start)
    [ "$VERBOSE" != no ] && log_daemon_msg "Starting $DESC" "$NAME"
    do_start
    case "$?" in
        0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
        2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
    esac
    ;;
  stop)
    [ "$VERBOSE" != no ] && log_daemon_msg "Stopping $DESC" "$NAME"
    do_stop
    case "$?" in
        0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
        2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
    esac
    ;;
  status)
       status_of_proc "$DAEMON" "$NAME" && exit 0 || exit $?
       ;;
  #reload|force-reload)
    #
    # If do_reload() is not implemented then leave this commented out
    # and leave 'force-reload' as an alias for 'restart'.
    #
    #log_daemon_msg "Reloading $DESC" "$NAME"
    #do_reload
    #log_end_msg $?
    #;;
  restart|force-reload)
    #
    # If the "reload" option is implemented then remove the
    # 'force-reload' alias
    #
    log_daemon_msg "Restarting $DESC" "$NAME"
    do_stop
    case "$?" in
      0|1)
        do_start
        case "$?" in
            0) log_end_msg 0 ;;
            1) log_end_msg 1 ;; # Old process is still running
            *) log_end_msg 1 ;; # Failed to start
        esac
        ;;
      *)
          # Failed to stop
        log_end_msg 1
        ;;
    esac
    ;;
  *)
    #echo "Usage: $SCRIPTNAME {start|stop|restart|reload|force-reload}" >&2
    echo "Usage: $SCRIPTNAME {start|stop|status|restart|force-reload}" >&2
    exit 3
    ;;
esac
Ищу дополнительный заработок (удалёнка).
Пьянка без секса – признак алкоголизма.

26

Kettler пишет:

И ещё раз пишите daemon так возьмите за основу skeleton

это инит-скрипт, а не демон.

Карусель разнесло по цепочке за час
Всех известий — конец
Да, весна началась!
(всё к лицу подлецу, как родному отцу, не рассказывай, батя, и так всё пройдёт)
drBatty пишет:

послать сигнал остановки

Каким образом?

Спасибо, Вы очень любезны.

28 (27.02.2012 11:13:47 отредактировано Сергей В.)

drBatty пишет:

А где fi?

3 if, 3 fi вроде как..

Вообщем скрипт пашет, и пока устраивает.. кое-что поменяю, но это позже

drBatty пишет:

использовать ping для проверки работы шлюзов - вообще плохая идея.

А что ещё можно?

Спасибо, Вы очень любезны.

29

Сергей В. пишет:

    послать сигнал остановки
Каким образом?

сигналы посылает у нас команда kill
вот так можно посмотреть список (у вас он может быть другой)

# kill -l
 1) SIGHUP     2) SIGINT     3) SIGQUIT     4) SIGILL     5) SIGTRAP
 6) SIGABRT     7) SIGBUS     8) SIGFPE     9) SIGKILL    10) SIGUSR1
11) SIGSEGV    12) SIGUSR2    13) SIGPIPE    14) SIGALRM    15) SIGTERM
16) SIGSTKFLT    17) SIGCHLD    18) SIGCONT    19) SIGSTOP    20) SIGTSTP
21) SIGTTIN    22) SIGTTOU    23) SIGURG    24) SIGXCPU    25) SIGXFSZ
26) SIGVTALRM    27) SIGPROF    28) SIGWINCH    29) SIGIO    30) SIGPWR
31) SIGSYS    34) SIGRTMIN    35) SIGRTMIN+1    36) SIGRTMIN+2    37) SIGRTMIN+3
38) SIGRTMIN+4    39) SIGRTMIN+5    40) SIGRTMIN+6    41) SIGRTMIN+7    42) SIGRTMIN+8
43) SIGRTMIN+9    44) SIGRTMIN+10    45) SIGRTMIN+11    46) SIGRTMIN+12    47) SIGRTMIN+13
48) SIGRTMIN+14    49) SIGRTMIN+15    50) SIGRTMAX-14    51) SIGRTMAX-13    52) SIGRTMAX-12
53) SIGRTMAX-11    54) SIGRTMAX-10    55) SIGRTMAX-9    56) SIGRTMAX-8    57) SIGRTMAX-7
58) SIGRTMAX-6    59) SIGRTMAX-5    60) SIGRTMAX-4    61) SIGRTMAX-3    62) SIGRTMAX-2
63) SIGRTMAX-1    64) SIGRTMAX    

сигнал - это сообщение одного процесса к другому. Передаёт их ядро. Это касается всех сигналов, кроме SIGKILL, этот сигнал не доходит до получателя, потому как ядро его насильно убивает (если у отправителя есть таие права конечно). вот ещё здесь доделали вроде: http://ru.wikipedia.org/wiki/SIGINT
Приложение-реципиент может игнорить сигналы (кроме конечно SIGKILL) (help trap), а может выполнять действие по умолчанию.

Сергей В. пишет:

3 if, 3 fi вроде как..

мне без отступов не видно.

Сергей В. пишет:

А что ещё можно?

ну раз вам маршрут нужен, то очевидно route или более прогрессивная утилита ip r
А вообще говоря, почему-бы вам не прописать 2 gateway'я? Тогда и переписывать ничего не надо...

Карусель разнесло по цепочке за час
Всех известий — конец
Да, весна началась!
(всё к лицу подлецу, как родному отцу, не рассказывай, батя, и так всё пройдёт)
drBatty пишет:

почему-бы вам не прописать 2 gateway'я?

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

Спасибо, Вы очень любезны.