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


Получить помощь и пообщаться с другими пользователями Ubuntu можно
на irc канале #ubuntu-ru в сети Freenode
и в Jabber конференции ubuntu@conference.jabber.ru

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

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

  • СуперМодератор
  • Старожил
  • *
  • Сообщений: 6015
  • 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

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

Оффлайн ReNzRv

  • Старожил
  • *
  • Сообщений: 2628
    • Просмотр профиля
Код: Bash
  1. Get_ip(){ wget -qO - eth0.me ; }
  2. prev_ip=$(Get_ip)
  3.  
  4. while true
  5. do
  6.         ip=$(Get_ip)
  7.         [ "$ip"0 != "$prev_ip"0 ] && systemctl restart
  8.         prev_ip=$ip
  9.         sleep 1m
  10. done
  11.  

Оффлайн matyus

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

kononvaler

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

Оффлайн ReNzRv

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

Оффлайн matyus

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

kononvaler

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

Оффлайн ReNzRv

  • Старожил
  • *
  • Сообщений: 2628
    • Просмотр профиля
В варианте от Azure предыдущее значение с которым сравнивается текущее ($last) записывается в файл /tmp/addr.tmp, а при первом запуске выполняется только запись тукущего в /tmp/addr.tmp:
Код: Bash
  1. else
  2.     echo "$last" > /tmp/addr.tmp
  3. 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

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

Оффлайн virusoft

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

 

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