Найкращий спосіб зробити гачок відключення?


9

Оскільки Ubuntu деякий час покладається на запуску, я хотів би використати завдання для початкового старту для витонченого вимкнення певних програм при відключенні або перезавантаженні системи. Важливо, щоб відключення або перезавантаження системи зупинилося до тих пір, поки ці програми не вимкнуться.

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

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

  • Немає загальної події вимкнення в старті
  • Використовуйте строфу, як start on starting shutdownу визначенні завдання
  • Використовуйте строфу, як start on runlevel [06S]у визначенні завдання
  • Використовуйте строфу, як start on starting runlevel [06S]у визначенні завдання
  • Використовуйте строфу, як start on stopping runlevel [!06S]у визначенні завдання

З цих рекомендацій виникають наступні питання:

  • Чи є або немає загальної події вимкнення в початковій роботі Ubuntu?
  • Який рекомендований спосіб реалізувати "гак відключення"?
  • Коли спрацьовують потокові рівні подій [x]; це коли ви вступили в рівень пробігу або при введенні на рівень пробігу?
  • Чи можемо ми використовувати щось на кшталт start on starting runlevel [x]або start on stopping runlevel [x]?
  • Що було б найкращим рішенням моєї проблеми?

Дуже дякую

Відповіді:


2

startingі runlevelце окремі події, тому ви не можете їх осмислено сказати starting runlevel N.

runlevel NПодія генерується на початку введення рівня виконання. Якщо ви start on runlevel Nтоді ваше завдання працює при вступі. Спосіб запуску після завершення входу на рівень запуску є run on started rc RUNLEVEL=N.

Як я розумію, вам потрібно start on runlevel [06S]робити те, що ви хочете; теоретично він повинен запускатися до того, як все інше зупиниться. Для більш точного контролю ви можете використовувати start on stopping apache or stopping mysql or ...так, щоб ваше завдання запускалося до того, як будь-яке з них буде дозволено закрити.


Відредаговано для зміни рівня 5 на S.


1
Крім того, єдина причина, що існує визначна startupподія, - це те, що щось потрібно для «заправки насоса». Після цього надсилається одна привілейована подія, все інше може бути і визначається робочими завданнями та завданнями, ініційованими startup. Що стосується того, що не відбудеться жодної shutdownподії, є занадто багато різних видів shutdown, щоб це було значимим. Краще безпосередньо залежати від завдань, які потрібно виконувати.
geekosaur

Дуже дякую. Я з вдячністю приймаю вашу відповідь, оскільки вона відповідає на мої запитання і вирішує проблему. Тим не менш, у мене є додаткове запитання / коментар (який, проте, не пов’язаний з проблемою): AFAIK, це мета початку, щоб повністю замінити концепцію пробігу. Той факт, що нам потрібно покластися на рівні рівня, щоб отримати глобальний гачок відключення, суперечить цій цілі. Я думаю, що для початківців доведеться запровадити таку подію. Я чітко розумію, що було б краще залежати від роботи, яка нам справді потрібна, але з іншого боку, в моєму випадку це ціла купа робочих місць ... продовження ...
Бінарус

(майже все, що працює), і я навіть не наважуюся думати про те, щоб з’ясувати зв’язок між процесами, що працюють на коробці (ps -Alf), і робочими місцями, які контролюють ці процеси; точно не існує відношення 1: 1. Є завдання, які не пов’язані з жодними процесами (наприклад, налаштування мережі), і я припускаю, що існує достатньо процесів, які так чи інакше не пов'язані з роботами, особливо при запуску речей вручну.
Олі

Upstart замінив жорсткі коди бігових рівнів; наскільки я можу визначити, концепція runlevel не відходить, вона просто визначена в просторі користувачів зараз. Якщо ви турбуєтеся про такий тривалий термін, тоді ви хочете використовувати мою останню пропозицію щодо запуску on stopping servicea or stoping serviceb or ...для будь-яких служб, які вам потрібні.
geekosaur

-1 за кілька неточностей. Визначившись, це насправді не вийде. зупинка на запущеному rc RUNLEVEL = [016] не відрізняється від „зупинки на рівні пробігу [016]“. Це тому, що жодна подія не блокує відключення від тривання. Існує також недійсний синтаксис, оскільки 'run on' недійсний. Загалом це просто плутає проблему, насправді це не допомагає. Вибачте, що це так пізно! Просто перегляд старих відповідей.
SpamapS

2

Щоб зупинити процес відключення, поки ваша робота зупиняється, вам потрібно скористатися цим:

stop on starting rc RUNLEVEL=[016]

Це спрацює, тому що перше, що відбувається при введенні 'shutdown' - це тунель 0. rc запускається на рівні запуску, і перехід від зупинки -> запускається повністю, поки будь-які завдання, які також повинні змінити стан, не завершать цей стан.

Ви хочете переконатися, що ваш процес швидко реагує на SIGTERM. Якщо він не відповість протягом 5 секунд, команда швидкого запуску надішле її SIGKILL. Ви можете підняти це за допомогою "kill timeout X".

1 там, btw, є дещо складним, вам потрібно переконатися, що ваш старт включає в себе те, що починається з runlevel [2345] в цей момент, так що користувач, який переходить на підтримку режиму єдиного користувача, знову починає свою роботу. На щастя, багато зроблено, щоб зробити це запропонованим звичним початком

start on runlevel [2345]

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

stop on deconfiguring-networking

Це подія, випущена пізніше під час вимкнення, яка також буде заблокована, поки будь-які завдання, які використовують її, повністю не завершать свої переходи у стан.


Ви мали на увазі start on starting ... Це не має особливого сенсу зупиняти мій гачок відключення на чому-небудь. start on starting rc RUNLEVEL=[016]мав би набагато більше сенсу. І, можливо, taskкинуто туди, щоб переконатися, що воно може закінчитися, перш ніж інші речі будуть працювати.
Теджай Кардон

0

Гекозавр, дуже дякую за допомогу.

Тим часом я спробував start on runlevel [016]метод, але він не вийшов, і я думаю, що розумію, чому:

Завдання справді розпочато, але процес завершення роботи не було заблоковано, поки завдання завдання не було закінчено. Зараз я цілком впевнений, що події startingі stoppingє єдиними подіями, які можуть бути використані у визначенні завдання для блокування інших завдань, і я думаю, що саме так намагаються нам розповісти посібники Upstart. Тому використання події runlevel ніколи не призведе до блокування інших завдань або до процесу відключення; таким чином, він марний для моєї мети.

Натомість у мене, здається, є дві можливості:

  1. Виконуючи одне із ваших пропозицій, знайдіть усі завдання, необхідні повторюваним програмам, і включіть їх у стартовий захід для такого сценарію:

    start on stopping job1 or stopping job2 or ...
    

    Це стільки роботи, що я серйозно замислююся над тим, щоб скинути список завдань і запустити його через sed, щоб автоматично створити стартову строфу для моєї роботи, яка включає всі завдання, які зазвичай виконуються в системі.

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

  2. Знайдіть ту роботу, яку буде зупинено спочатку при перезавантаженні / вимкненні системи (назвемо цю роботу "FirstJob") і використовуйте її в строфі, як:

    start on stopping FirstJob
    

    Основні недоліки полягають у тому, що я не знаю, чи існує така робота взагалі, і чи справді ця робота залежить від усіх інших робочих місць, від яких насправді залежить повторне застосування ("в залежності від іншої роботи", в цьому випадку означає "буде припинено повністю до того, як інша робота почне припинятися ").

Я не впевнений, яка з двох можливостей є кращою ...


Я б зараз робив sedсценарій, якби я був у вашому взутті.
geekosaur
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.