Page 1 of 17 12311 ... LastLast
Results 1 to 15 of 242

Thread: Правильное выключение роутера

  1. #1
    Join Date
    May 2007
    Location
    Истра
    Posts
    1,246

    Post Правильное выключение роутера

    Посмотрел я на рекомендации по перезагрузке роутера в теме "Установка программ для чайника" и решил написать свою версию pre-shutdown. Теперь выкладываю её (и кое-что ещё) на суд общественности.
    Сразу отмечу, что писалось и тестировалось на wl-500gp с прошивкой 1.9.2.7-10, но по идее должно работать и на остальном. За основу взяты скрипты из вышеупомянутой темы.

    1. Собственно, pre-shutdown. При написании использовались некоторые идеи отсюда, отсюда и из стартовых скриптов "большого" линукса. В скрипте используются только те возможности, которые доступны в роутере без установки каких-либо пакетов. Скрипт получился большой, но зато он сделает своё дело в подавляющем большинстве случаев.
    Сразу опишу нерешённые проблемы (они также перечислены в начале скрипта на ломаном английском):
    1. Перекрывающиеся монтирования.
      Если вы смонтируете одну ФС на, например, папку "/path/to/dir", а затем другую ФС на ту же "/path/to/dir" либо выше, на "/path/to" или "/path" (спрятав тем самым первую ФС из области видимости), то `fuser -m "/path/to/dir"` не сможет найти открытые файлы на первой ФС (значит, нет гарантий, что мы сможем её перемонтировать на чтение). Можно было бы использовать имя устройства вместо точки монтирования, но fuser из busybox не понимает этого. Можно, правда, установить пакет "psmisc", fuser оттуда поймёт имя устройства и покажет на нужные процессы (скрипт для этого нужно будет править).
      Но тут есть вторая часть проблемы: вызов `mount -o remount,ro ...` не сможет перемонтировать первую ФС, какие бы комбинации "имя устройства"+"точка монтирования" ему ни передавали.
      Решением может быть отмонтирование второй ФС с последующими манипуляциями над первой либо просто отказ от таких конфигураций.
    2. Необычные имена swap-файлов.
      Если вы создадите и без внесения в fstab подключите swap-файл (не раздел), имя которого содержит перевод строки (да, такое возможно), то скрипт не сможет отключить такой файл и, соответственно, не сможет перемонтировать на чтение ФС с этим файлом.
      Решение: отмонтировать такой файл вручную (внести явную команду в скрипт) либо опять же отказаться от использования таких имён.
    3. (не описана в скрипте)
      Может так сложиться, что какой-то процесс откроет файл на запись на интересующем нас разделе уже после того, как скрипт завершит убиение процессов, использующих раздел. Против этого трудно придумать что-то гарантированно работающее.

    Примерная логика работы скрипта:
    1. Остановка сервисов: если существует исполняемый файл "/opt/etc/init.d/rc.unslung", он вызывается с параметром "stop".
    2. Сброс буферов (вызов sync).
    3. Отправка сигнала TERM процессам, имеющим открытые файлы на интересующих нас разделах, и ожидание их завершения, но не дольше указанного времени (задаётся в начале скрипта, по умолчанию 20 секунд). Стоит отметить, что по уму надо бы завершать только те процессы, которые имеют открытые на запись файлы, но fuser такой информации не даёт.
    4. Если на предыдущем шаге остались живые процессы, то список составляется заново и на этот раз отправляется сигнал KILL (опять же с ожиданием завершения, по умолчанию 5 секунд).
    5. Отключение свопа (swapoff -a и прохождение по файлу "/proc/swaps").
    6. Перемонтирование интересующих нас ФС на чтение.

    В скрипте есть зависимость от файла "/usr/local/sbin/signal_and_wait.inc.sh" (описан ниже).
    Что можно настроить в скрипте:
    • Таймаут ожидания (в секундах) после отправки сигналов TERM и KILL, соответственно
      Code:
      terminate_timeout="20"
      kill_timeout="5"
    • Какие файловые системы нас интересуют (для перемонтирования на чтение), это регулярное выражение awk
      Code:
      filesystems_regexp='/^(ext3|vfat)$/'
      Если у вас в качестве корневой ФС используется какой-то раздел с внешнего носителя (смонтированный на запись), то имеет смысл исключить его, а то скрипт попытается убить почти все процессы, а с разделом уже разбираться отдельно
      Code:
      filesystems_regexp='/^(ext3|vfat)$/ && $2 != "/"'

    2. Файл signal_and_wait.inc.sh. Он не исполняемый, включается в другие скрипты. Содержит одну функцию, signal_and_wait, которая посылает указанный сигнал указанным процессам и ожидает их завершения указанное время

    3. Стартовый скрипт S99rtorrent (для тех, у кого используется rtorrent). Улучшенный скрипт, взятый из темы про установку для чайников. Суть в том, что он теперь гарантированно останавливает rtorrent. Он посылает процессу последовательно 3 сигнала и после каждого ждёт завершения процесса в течение указанного времени (аналогично pre-shutdown). Сигналы: INT (нормальное завершение), TERM (быстрое завершение, без отсылки статистики на трекеры), KILL (немедленное убийство процесса). Таймаут ожидания после каждого из сигналов задаётся в начале скрипта:
    Code:
    interrupt_timeout="10"
    terminate_timeout="120"
    kill_timeout="5"
    В этом скрипте тоже используется файл "/usr/local/sbin/signal_and_wait.inc.sh".

    Несколько слов по конфигурации.

    Если вы используете rtorrent (настройка S99rtorrent):
    а) если вам нужно, чтобы он успел отослать статистику на трекеры, установите побольше interrupt_timeout (скажем, 5 минут = 300 секунд), но имейте в виду, если у вас pptp/pppoe/l2tp, то это соединение отключится до запуска pre-shutdown (если вы дали команду reboot/halt), так что никакая статистика уже не отправится;
    б) если статистика вам не так важна, но важно, чтоб rtorrent завершился точно по своей воле, установите небольшой interrupt_timeout (секунд 5-10), но побольше terminate_timeout (опять же, скажем, 300 секунд);
    в) если просто хотите быстрого завершения работы, неважно, в каком состоянии окажутся закачки (вас не пугает перехеширование при старте), то установите interrupt_timeout и terminate_timeout по минимуму (секунд 5), а уж KILL в конце его прибьёт.

    Если вы помимо этого используете любые другие программы или тот же rtorrent, но не с моим S99rtorrent (настройка pre-shutdown):
    а) если вам нужно дать программам больше времени на добровольное завершение, увеличьте terminate_timeout (сколько вам не жалко ждать);
    б) если вам дорого время и вы не хотите ждать, пока все процессы завершат свои дела, поставьте terminate_timeout небольшим (да хоть 0), можете при этом увеличить kill_timeout до 10, но вряд ли это необходимо.

    Сами скрипты - в приложенном архиве. Пути, куда их класть:
    /usr/local/sbin/pre-shutdown
    /usr/local/sbin/signal_and_wait.inc.sh
    /opt/etc/init.d/S99rtorrent

    Update: обновил S99rtorrent:
    при старте не создаётся окно screen с шеллом. Бонус: при завершении торрента screen сам выходит;
    при старте stdout команд тоже пишется в лог;
    при завершении, если дело доходит до сигнала KILL, удаляется файл rtorrent.lock
    Attached Files Attached Files
    Last edited by Omega; 03-04-2011 at 18:42. Reason: 2 post merged

  2. #2
    Join Date
    Nov 2007
    Location
    Belarus, Gomel
    Posts
    168

    Правильное выключение роутера

    Как правильно включать-выключать роутер (в моём случае wl500gP)?
    Что-то мне подсказывает, что выдёргивать блок питания из розетки, это неправильное решение

  3. #3
    Quote Originally Posted by Lupo_Alberto View Post
    Как правильно включать-выключать роутер (в моём случае wl500gP)?
    Что-то мне подсказывает, что выдёргивать блок питания из розетки, это неправильное решение
    Я год выдергиваю - все норм
    пьфу-пьфу-пьфу

    но у меня нет фтп (навешенных флешек и HDD)

  4. #4
    Join Date
    Dec 2003
    Location
    Russian Federation
    Posts
    8,353
    Правильно хотя бы сказать halt, а ещё лучше в pre-shutdown добавить отомонтирование флешек. Можно на кнопку ez-setup это повесить.

    Хотя, если флешек нет, то можете смело выдёргивать.

  5. #5
    дико извиняюсь а зачем в прешутдаун размонтирование, оно же и так автоматом запустится?
    vim имеет два режима - бибикать и все портить (с) не мое

  6. #6
    Join Date
    Feb 2007
    Location
    Moscow, Russia
    Posts
    3,805
    наивная душа... Я ж здесь наглядный тест показывал --- если вручную не размонтировать, то ни хрена clean ф.с. при старте не получишь.

  7. #7
    Словил такой глюк: железка перестала реагировать на reboot, halt и kill -9, в логах - тишина.. Размонтировал всё и выключил по питанию.

  8. #8
    djet: один раз была такая фигня, не помню как достиг такого просветления, после того как всетаки обесточил и включил, прифшлось перезаливать flash. незнаю что было, но мне не понравилось
    vim имеет два режима - бибикать и все портить (с) не мое

  9. #9
    Quote Originally Posted by al37919 View Post
    наивная душа... Я ж здесь наглядный тест показывал --- если вручную не размонтировать, то ни хрена clean ф.с. при старте не получишь.
    ок. подключу скрипт для размнтирования.
    vim имеет два режима - бибикать и все портить (с) не мое

  10. #10
    Quote Originally Posted by al37919 View Post
    наивная душа... Я ж здесь наглядный тест показывал --- если вручную не размонтировать, то ни хрена clean ф.с. при старте не получишь.
    именно поэтому я использую pre-mount для форсированной проверки диска при подключении
    wl500gP 128MB + 8GB flash 1.9.2.7-rtn-r5438

  11. #11
    Join Date
    Nov 2007
    Location
    Belarus, Gomel
    Posts
    168
    Quote Originally Posted by Oleg View Post
    Правильно хотя бы сказать halt, а ещё лучше в pre-shutdown добавить отомонтирование флешек. Можно на кнопку ez-setup это повесить.

    Хотя, если флешек нет, то можете смело выдёргивать.
    А если не флэшка, а жёсткий диск в USB-box?
    После halt есть какая-либо возможность включить роутер кроме как передёргивания блока питания?

  12. #12
    Join Date
    Feb 2007
    Location
    Moscow, Russia
    Posts
    3,805
    А если не флэшка, а жёсткий диск в USB-box?
    аналогично
    После halt есть какая-либо возможность включить роутер кроме как передёргивания блока питания?
    нет. Если только роутер не поддерживает WOL, а он его не поддерживает ( http://wl500g.info/showthread.php?t=4594 ).

  13. #13
    Join Date
    Jan 2008
    Location
    Minsk Belarus
    Posts
    94
    Уточните пожалуйста, если я говорю halt, pre-shutdown отработает и после этого наступит полный halt?

  14. #14
    Join Date
    Dec 2003
    Location
    Russian Federation
    Posts
    8,353
    Да, так и будет.

  15. #15

    Question Есть ли команда в нашем роуте типа shutdown?

    Есть ли команда в нашем роуте типа shutdown (я не про pre-shutdown, а про прогу, которая бы полностью всё KILL) как на компе?

Page 1 of 17 12311 ... LastLast

Similar Threads

  1. Перезагрузка и выключение роутера после прошивки
    By pheny in forum Russian Discussion - РУССКИЙ (RU)
    Replies: 161
    Last Post: 01-05-2014, 21:56
  2. Отправка и получение SMS с роутера
    By reyko in forum Russian Discussion - РУССКИЙ (RU)
    Replies: 15
    Last Post: 04-03-2013, 12:27

Tags for this Thread

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •