Лучший способ заставить завершение работы сцепиться?

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

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

Я думаю, что могу решить это новомодным заданием, которое будет инициировано на завершении работы, но я не уверен, какие события я должен использовать в который способ. До сих пор я считал следующее (частично противоречащий) операторы:

  • В выскочке нет никакого общего события завершения работы
  • Используйте строку файла конфигурации как start on starting shutdown в определении задания
  • Используйте строку файла конфигурации как start on runlevel [06S] в определении задания
  • Используйте строку файла конфигурации как start on starting runlevel [06S] в определении задания
  • Используйте строку файла конфигурации как start on stopping runlevel [!06S] в определении задания

Из этих рекомендаций возникают следующие вопросы:

  • Есть ли или там не общее событие завершения работы в выскочке Ubuntu?
  • Что рекомендуемый путь состоит в том, чтобы реализовать "рычаг завершения работы"?
  • Когда события runlevel [x] инициированный; это когда вводивший runlevel или при вводе runlevel?
  • Мы можем использовать что-то как start on starting runlevel [x] или start on stopping runlevel [x]?
  • Каково было бы лучшее решение для моей проблемы?

Большое спасибо

9
задан 23 February 2015 в 17:37

3 ответа

start и runlevel являются отдельными событиями, поэтому вы не можете достоверно сказать start runlevel N.

событие runlevel N выдается в начале входа на уровень выполнения. Если Вы запускаете уровень N, то Ваша задача запускается на входе. Путь к запуску по завершению входа на уровень - запуск на запущенном rc RUNLEVEL=N.

Как я понимаю, для того, чтобы сделать то, что Вы хотите, Вам нужен старт на уровне [06S]; теоретически он должен быть запущен до того, как будет остановлено что-либо еще. Для более тонкого управления можно использовать start на остановке apache или mysql или ..., чтобы ваша задача выполнялась до того, как будет разрешено выключить любой из них.


отредактировано для изменения уровня выполнения 5 на S.

2
ответ дан 23 February 2015 в 17:37

.

Geekosaur, большое спасибо за помощь.

Тем временем, я пробовал метод start on runlevel [016], но он не сработал, и, кажется, я понимаю, почему:

Задание действительно было запущено, но процесс выключения не был заблокирован до тех пор, пока задание не было выполнено. Теперь я вполне уверен, что события start и stop - это единственные события, которые можно использовать в определении задания, чтобы заблокировать другие задания, и я думаю, что это то, о чем нам пытаются рассказать руководства Upstart. Поэтому использование события уровня выполнения никогда не приведет к блокированию других вакансий или процесса выключения; таким образом, это бесполезно для моей цели.

Вместо этого, кажется, у меня есть две возможности:

  1. Следуя одному из ваших предложений, найдите все вакансии, которые нужны соответствующим приложениям, и включите их все в событие старта для такого скрипта:

    start on stopping job1 или stop job2 или ....
    

    Это настолько много работы, что я всерьёз думаю о дампинге списка вакансий и запуске его через sed для автоматического создания стартовой строфы для моей работы, которая включает в себя все работы, которые обычно выполняются в системе.

    Преимущество заключается в том, что соответствующие приложения будут закрыты, даже если кто-то остановит одно из предварительных условий вручную (в отличие от остановки их изменением уровня выполнения / выключением / перезагрузкой).

  2. Найдите одно задание, которое будет остановлено в первый раз при перезагрузке / выключении системы (давайте назовем это задание "FirstJob") и используйте это задание в строфе типа:

    start on stopping FirstJob
    Основные недостатки заключаются в том, что я не знаю, существует ли такое рабочее место вообще и действительно ли это рабочее место зависит от  всех  других рабочих мест, от которых на самом деле зависит соответствующее приложение ("зависит от другого рабочего места" в данном случае означает "будет полностью остановлено до того, как другое рабочее место начнет останавливаться"). 

Я не уверен, какая из двух возможностей лучше...

0
ответ дан 23 February 2015 в 17:37

Для того, чтобы остановить завершение работы во время остановки задания, вы захотите использовать следующее:

stop on starting rc RUNLEVEL=[016]

Это сработает, потому что первое, что произойдет, когда вы наберете 'shutdown' - это будет выдан уровень tunlevel 0. rc запускается на уровне выполнения, и переход от остановленного -> запуска будет полностью блокирован до тех пор, пока любые задания, которые также должны изменить состояние, не завершат это состояние.

Вам необходимо убедиться, что Ваш процесс быстро реагирует на SIGTERM. Если он не ответит в течение 5 секунд, то при запуске программа отправит ему ЗАПИСЬ. Вы можете поднять этот параметр с помощью 'kill timeout X'.

The 1 in there, btw is a bit tricky, you need to sure your start on includes includes something that starts on at the runlevel [2345] at that point, so to a user going down for single user mode maintenance get their job on again start. К счастью, много работы было проделано для того, чтобы сделать это обычным запуском на

start on runlevel [2345]

Также в некоторых случаях вам нужно что-то, что будет продолжать работать до тех пор, пока сеть не будет разрушена (например, dbus/network-manager). Для этого вам нужно

stop on deconfiguring-networking

Это событие, генерируемое позже при выключении, которое также будет блокироваться до тех пор, пока все задания, использующие его, полностью не завершат свои переходы в состояние.

2
ответ дан 23 February 2015 в 17:37

Другие вопросы по тегам:

Похожие вопросы: