Форум русскоязычного сообщества Ubuntu


Хотите сделать посильный вклад в развитие Ubuntu и русскоязычного сообщества?
Помогите нам с документацией!

Автор Тема: Помогите настроить автоперезапуск службы при смене внешнего IP (Ub 16.04)  (Прочитано 1238 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн matyus

  • Автор темы
  • Новичок
  • *
  • Сообщений: 7
    • Просмотр профиля
  Прошу помощи. Ситуация такая: интернет от Ростелекома приходит на ADSL-модем, оттуда на роутер Asus RT-N12VP, оттуда на комп. с установленной Ubuntu 16.04, на котором постоянно работает некая служба.
  Служба работает корректно до тех пор, пока не смениться внешний динамический IP адрес, который Ростелеком назначает модему. После смены внешнего IP адреса, необходимо перезапустить службу, чтобы восстановить её работоспособность. Хотелось бы, чтобы это происходило автоматом.
  Как я это вижу: создаётся ещё одна служба, которая по скрипту один раз в 1-2 минуты запрашивает внешний IP (например: wget -qO- eth0.me ), сравнивает полученное значение с предыдущим, и если оно изменилось, то перезапускает основную службу (например systemctl restart my_service.service), если нет - ничего непроисходит. Собственно, просьба объяснить, что написать в скрипте (синтаксис, команды ?).
  На Ubunte первый месяц, копаю как могу, но пока знаний не хватает. Заранее спасибо.

Оффлайн Azure

  • Почётный модератор
  • Старожил
  • *
  • Сообщений: 6017
  • Windows10, i3wm on Debian9, Manjaro20.0
    • Просмотр профиля
один раз в 1-2 минуты
cron
сравнивает полученное значение с предыдущим
test
если оно изменилось, то … если нет
if … then … else … fi
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

Оффлайн matyus

  • Автор темы
  • Новичок
  • *
  • Сообщений: 7
    • Просмотр профиля
Про сron вроде понял, test - чистой воды програмирование!

# Запрос IP
wget -qO- eth0.me

# ответ придёт в виде 90.91.92.93 Как этот ответ подставить в кавычки?

[ "первый ответ" != "второй ответ" ];echo $?

Получается, что надо первый раз запросить IP, как-то сохранить ответ, затем второй раз запросить IP через 1 минуту , второй ответ сравнить с первым (сохранённым) и сделать вывод "совпал/не совпал", а потом then systemctl restart


« Последнее редактирование: 05 Апреля 2017, 20:06:35 от matyus »

Оффлайн Azure

  • Почётный модератор
  • Старожил
  • *
  • Сообщений: 6017
  • Windows10, i3wm on Debian9, Manjaro20.0
    • Просмотр профиля
чистой воды програмирование!
Код: (bash) [Выделить]
last=$(wget -qO- eth0.me)
if [ -s /tmp/addr.tmp ] ; then
    address=$(cat /tmp/addr.tmp)
    if [ "${address:-0}" != "$last" ] ; then
        echo "$last" > /tmp/addr.tmp
        systemctl restart my_service.service
    fi
else
    echo "$last" > /tmp/addr.tmp
fi
« Последнее редактирование: 05 Апреля 2017, 20:31:04 от Azure »
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

Оффлайн ReNzRv

  • Старожил
  • *
  • Сообщений: 2648
    • Просмотр профиля
Код: (bash) [Выделить]
Get_ip(){ wget -qO - eth0.me ; }
prev_ip=$(Get_ip)

while true
do
ip=$(Get_ip)
[ "$ip"0 != "$prev_ip"0 ] && systemctl restart
prev_ip=$ip
sleep 1m
done

Оффлайн matyus

  • Автор темы
  • Новичок
  • *
  • Сообщений: 7
    • Просмотр профиля
  Огромное спасибо обоим! Завтра утром приеду домой попробую.
  Для понимания процесса хочется понять: откуда берётся самое первое значение, с которым затем сравниваются все последующие?
  Но вообще это конечно круто! Я уже полез читать про команду test и переменные в Linux, напредставлял себе скрипт строк на 40, а тут вот оно как!

kononvaler

  • Гость
Потому я и стесняюсь показывать свои скрипты, они работают, но не сравнить по стилю  :'(  .....
У меня похожая задача, я отправляю себе в чат в телеграм свой адрес при его смене,
Хочу заметить что еще в итоге добавил проверку на возрат не пустого значения, может конечно у меня провайдер плохой, но так бывает. В итоге получал пустое значение, а затем опять предыдущий адрес.

Оффлайн ReNzRv

  • Старожил
  • *
  • Сообщений: 2648
    • Просмотр профиля
Для понимания процесса хочется понять: откуда берётся самое первое значение, с которым затем сравниваются все последующие?
Сравниваются не первое со всеми последующими, а текущее с предыдущим.

Оффлайн matyus

  • Автор темы
  • Новичок
  • *
  • Сообщений: 7
    • Просмотр профиля
Сравниваются не первое со всеми последующими, а текущее с предыдущим.
Это понятно, но в самом начале, когда скрипт только запускается, он должен какой-то отдельной командой получить самое первое "стартовое" значение, с которым сравнит второе? Ясно, что второе потом займёт место первого и третье будет сравниваться со вторым и так пока не остановишь, но первый шаг разве не должен быть каким-то отдельным?

kononvaler

  • Гость
но первый шаг разве не должен быть каким-то отдельным?
сравнит с пустым результатом, так как они будут не совпадать в итоге запишется значение.

Оффлайн ReNzRv

  • Старожил
  • *
  • Сообщений: 2648
    • Просмотр профиля
В варианте от Azure предыдущее значение с которым сравнивается текущее ($last) записывается в файл /tmp/addr.tmp, а при первом запуске выполняется только запись тукущего в /tmp/addr.tmp:
Код: (bash) [Выделить]
else
    echo "$last" > /tmp/addr.tmp
fi

Мой скрипт запускается только один раз от рута т.к используется systemctl и работает постоянно в фоне, не используя для работы никаких файлов. Прописать в рутовый крон для запуска при загрузке можно так:
@reboot /path/to/script.sh &
Скрипт:
#!/bin/bash

export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

Get_ip(){ wget -qO - eth0.me ; }
prev_ip=$(Get_ip)

while true
do
        ip=$(Get_ip)
if [ "$ip" ]
then
[ "$ip"0 != "$prev_ip"0 ] && systemctl restart my_service.service
prev_ip=$ip
fi
        sleep 1m
done

my_service.service замени на имя службы.
И не забудь:
sudo chmod +x /path/to/script.sh

Пользователь добавил сообщение 05 Апреля 2017, 21:51:16:
Но вариант от Azure я бы все-таки чуть переделал:
#!/bin/bash
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

ip=$(wget -qO - eth0.me)
[ "$ip" ] || exit
prev_ip=$ip
[ -s /tmp/save_prev_ip ] && prev_ip=$(cat /tmp/save_prev_ip)
echo "$ip" > /tmp/save_prev_ip
[ "$ip" != "$prev_ip" ] && systemctl restart my_service.service

В крон (запуск через минуту):
* * * * * /path/to/script.sh
« Последнее редактирование: 05 Апреля 2017, 21:54:05 от renzrv »

Оффлайн matyus

  • Автор темы
  • Новичок
  • *
  • Сообщений: 7
    • Просмотр профиля
сравнит с пустым результатом, так как они будут не совпадать в итоге запишется значение.

Он не только сравнит с пустым, но поняв, что они не совпадают, сразу перезапустит основную службу (ради которой и городится весь этот огород). Фактически запуск скрипта будет начинаться с перезапуска основной службы. Мне так кажется.

kononvaler

  • Гость
я у себя пишу в файл, тогда даже после перезагрузки компа будет с чем сравнить. и, как уже указывал, проверяю на не пустое значение ответ сервера. Прошу уважаемых гуру рассмотреть этот вопрос.

Оффлайн ReNzRv

  • Старожил
  • *
  • Сообщений: 2648
    • Просмотр профиля
Фактически запуск скрипта будет начинаться с перезапуска основной службы. Мне так кажется.
Нет. В моем и варианте от Azure это учтено.

Оффлайн virusoft

  • Активист
  • *
  • Сообщений: 323
    • Просмотр профиля
    • Virusoft
(Нажмите, чтобы показать/скрыть)
Покупка белого IP заставит вас вообще отказаться от написания скрипта по ненадобности.
Просто и без лишних движений, кроме финансовых конечно.  :coolsmiley:
Если работает - не трогай. Linux - гибкая система, но один раз прогнувшись может обратным ходом распрямиться и ударить по самому (…) месту. Думай о будущем и все будет хорошо.

 

Страница сгенерирована за 0.056 секунд. Запросов: 23.