Так как Ubuntu полагается на выскочку в течение некоторого времени теперь, я хотел бы использовать новомодное задание для корректного завершения работу определенных приложений на завершении работы системы или перезагрузке. Важно, чтобы завершение работы или перезагрузка системы были остановлены, пока эти приложения не закрываются.
Приложения будут запущены вручную при случае, и на завершении работы системы должен автоматически быть закончен сценарием (который я уже имею). Так как приложения не могут быть закончены надежно без (почти всего) другого сервисного выполнения, окончание приложений должно быть сделано, прежде чем остальная часть завершения работы начинается.
Я думаю, что могу решить это новомодным заданием, которое будет инициировано на завершении работы, но я не уверен, какие события я должен использовать в который способ. До сих пор я считал следующее (частично противоречащий) операторы:
start on starting shutdown
в определении заданияstart on runlevel [06S]
в определении заданияstart on starting runlevel [06S]
в определении заданияstart on stopping runlevel [!06S]
в определении заданияИз этих рекомендаций возникают следующие вопросы:
start on starting runlevel [x]
или start on stopping runlevel [x]
?Большое спасибо
start
и runlevel
являются отдельными событиями, поэтому вы не можете достоверно сказать start runlevel N
.
событие runlevel N
выдается в начале входа на уровень выполнения. Если Вы запускаете уровень N
, то Ваша задача запускается на входе. Путь к запуску по завершению входа на уровень - запуск на запущенном rc RUNLEVEL=N
.
Как я понимаю, для того, чтобы сделать то, что Вы хотите, Вам нужен старт на уровне [06S]
; теоретически он должен быть запущен до того, как будет остановлено что-либо еще. Для более тонкого управления можно использовать start на остановке apache или mysql или ...
, чтобы ваша задача выполнялась до того, как будет разрешено выключить любой из них.
отредактировано для изменения уровня выполнения 5 на S.
.
Geekosaur, большое спасибо за помощь.
Тем временем, я пробовал метод start on runlevel [016]
, но он не сработал, и, кажется, я понимаю, почему:
Задание действительно было запущено, но процесс выключения не был заблокирован до тех пор, пока задание не было выполнено. Теперь я вполне уверен, что события start
и stop
- это единственные события, которые можно использовать в определении задания, чтобы заблокировать другие задания, и я думаю, что это то, о чем нам пытаются рассказать руководства Upstart. Поэтому использование события уровня выполнения никогда не приведет к блокированию других вакансий или процесса выключения; таким образом, это бесполезно для моей цели.
Вместо этого, кажется, у меня есть две возможности:
Следуя одному из ваших предложений, найдите все вакансии, которые нужны соответствующим приложениям, и включите их все в событие старта для такого скрипта:
start on stopping job1 или stop job2 или ....
Это настолько много работы, что я всерьёз думаю о дампинге списка вакансий и запуске его через sed для автоматического создания стартовой строфы для моей работы, которая включает в себя все работы, которые обычно выполняются в системе.
Преимущество заключается в том, что соответствующие приложения будут закрыты, даже если кто-то остановит одно из предварительных условий вручную (в отличие от остановки их изменением уровня выполнения / выключением / перезагрузкой).
Найдите одно задание, которое будет остановлено в первый раз при перезагрузке / выключении системы (давайте назовем это задание "FirstJob") и используйте это задание в строфе типа:
start on stopping FirstJob
Основные недостатки заключаются в том, что я не знаю, существует ли такое рабочее место вообще и действительно ли это рабочее место зависит от всех других рабочих мест, от которых на самом деле зависит соответствующее приложение ("зависит от другого рабочего места" в данном случае означает "будет полностью остановлено до того, как другое рабочее место начнет останавливаться").
Я не уверен, какая из двух возможностей лучше...
Для того, чтобы остановить завершение работы во время остановки задания, вы захотите использовать следующее:
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
Это событие, генерируемое позже при выключении, которое также будет блокироваться до тех пор, пока все задания, использующие его, полностью не завершат свои переходы в состояние.