У systemd, яка різниця між After = і Requires =?


53

Я створюю systemd .service файл, і мені потрібна допомога в розумінні різниці між Requires=і After=. На головній сторінці написано, що Requires="Налаштування залежностей від вимог щодо інших одиниць". та After="Налаштування впорядкування залежностей між одиницями." Яка різниця?

Відповіді:


43

After=налаштовує порядок обслуговування (виконайте X лише після Y), а Requires=залежність від стану. Якщо ви не вказали замовлення, послуга залежно від іншого буде запускатися одночасно із послугою, від якої вона залежить. Крім того, те, як я це розумію (хоча я не можу перевірити це зараз і не знайти посилання), After=- це "вільне з'єднання", і служба з таким твердженням все-таки працюватиме, якби той, хто названий у After=рядку isn Require=Починати не було взагалі, тоді як це не дозволило б його запустити, якщо вимога не буде виконана.

Посилаючись на https://www.freedesktop.org/software/systemd/man/systemd.unit.html :

Потрібно =

Налаштування залежності вимог від інших одиниць. Якщо цей пристрій активується, будуть також активовані перелічені тут одиниці. Якщо один з інших блоків вимкнеться або його активація не вдасться, цей пристрій буде вимкнено. Цей параметр може бути визначений більше одного разу або кілька одиниць, розділених пробілом, можуть бути вказані в одному варіанті, в цьому випадку будуть створені залежності вимог для всіх перелічених імен. Зауважте, що залежність від вимог не впливає на порядок запуску чи зупинення послуг. Це потрібно налаштувати самостійно за допомогою параметрів After = або Before =. Якщо для підрозділу foo.service потрібна одиниця bar.service, налаштована за допомогою Requires =, і впорядкування не налаштовано з After = або Before =, тоді обидва блоки будуть запущені одночасно і без жодної затримки між ними, якщо foo.service активовано. Часто,

і

Перед =, після =

Список розділених пробілом назв одиниць. Налаштування впорядкування залежностей між одиницями. Якщо одиниця foo.service містить налаштування Before = bar.service і обидва блоки запускаються, запуск bar.service затримується до запуску foo.service. Зауважте, що цей параметр не залежить від ортогональних залежностей від вимог, налаштованих Requires =. Це загальна модель, щоб включити ім'я одиниці в параметр After = і Requires =, і в цьому випадку перелічений блок буде запущений до блоку, який налаштований за допомогою цих параметрів. Цей параметр може бути вказаний не один раз, і в цьому випадку створюються впорядковані залежності для всіх перелічених імен. After = - це зворотне значення Before =, тобто в той час, як After = гарантує, що налаштований блок запускається після запуску перерахованого блоку, Before = забезпечує зворотне, тобто що налаштований блок повністю запускається до запуску перерахованого блоку. Зауважте, що коли два одиниці з залежністю між ними впорядковані, вимкнено зворотний порядок запуску. тобто якщо на іншому блоці налаштовано модуль After =, перший зупиняється перед другим, якщо обидва вимкнуті. Враховуючи два одиниці з будь-якою залежністю впорядкування між ними, якщо одна одиниця вимикається, а інша запускається, відключення замовляють перед запуском. Не має значення, чи залежність замовлення є After = або Before =. Також не має значення, яке з двох вимкнене, поки одне закрите, а інше запущене. Відключення замовляється перед запуском у всіх випадках. Якщо між двома одиницями немає залежностей від впорядкування між собою, вони вимикаються або запускаються одночасно,


7
Що таке залежність, якщо не заява про наказ? (серйозно ... я не розумію різниці)
TomOnTime

Дивіться мою редакцію. Моє розуміння: After=Xозначало б "Зробіть це після X, якщо X зроблено", тоді як Require=Xозначає "не робіть цього взагалі, якщо ви не можете зробити X".
Свен

Before=Частина сторінки людини , здається, підтверджує це. If a unit foo.service contains a setting Before=bar.service and both units are being started, bar.service's start-up is delayed until foo.service is started up Наскільки я розумію це, замовлення не виконується, якщо bar.serviceвсе-таки не розпочатись і foo.serviceрозпочнеться нормально.
Свен

10

Одна з головних відмінностей полягає в тому,

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

Подумайте, у мене є одиничний файл test-app.service,

[Unit]
Description=test app
After=network-online.target

Ось що буде, коли ця заява буде виконана,

  • Afterперевіряє, чи network-online.target.
  • якщо network-online.targetне розпочато, воно зачекає.
  • test-appпочинається лише після того, network-online.targetяк активний

Якби я Requiresнатомість,

[Unit]
Description=test app
Requires=network-online.target

Ось що буде, коли ця заява буде виконана,

  • network-online.targetі test-appактивуються разом
  • якщо network-online.targetневдалий запуск test-appне буде активовано.

2

systemd - менеджер по роботі. Сторінка людини не дуже точна щодо того, як все працює.

Коли ви завантажуєтесь, що systemd робить, це побудувати транзакцію, що складається з завдань для прив’язного завдання (тобто, розпочати роботу для default.target). Що всі ці залежності і стосунки роблять - це визначати, як і які завдання будуть працювати. Замовлення визначає, яку роботу (-ів) буде чекати кожна інша робота. Таким чином, цільовий блок за замовчуванням знаходиться в центрі всього цього, і тому при включенні одиниць ви використовуєте зворотну залежність, яка через включення systemctl створює символічне посилання файлової системи, що позначає пряму залежність, яку може застосувати systemd (також, чому вам потрібна символьна посилання на файлову систему першість). Аналогічно, коли ви вручну запускаєте якусь одиницю, тоді ця одиниця є якорем, а транзакція обчислюється wrt її.

Не буду надто детально, я поясню, що вимагає = і після = робить.

Requires = призведе до того, що systemd запустить стартове завдання для потрібного блоку, коли ви отримаєте стартове завдання (явно або через залежність: немає розрізнення внутрішньо). Він також має властивість запускати роботу зупинки на вас, коли цей пристрій зупинено (зверніть увагу: зупинено, не спускається самостійно) або перезапущено. Це означає, що якщо якась залежність / systemctl змушує його зупинятись / перезапускати, ви також зупинитесь / перезапустите. Однак, якщо воно піде самостійно, ви не зупинитесь, оскільки роботи не було, а зміна держави відбулася без участі системи. Ось де ви б використовували BindsTo = (подібно до блоків пристроїв, які з очевидних причин можуть переходити до неактивних без участі системи).

Тепер використання After = рекомендується, оскільки Requires = поодинці є раціональним для того, що він робить: скасуйте реквізит, якщо стартове завдання не вдасться. Це скасування, однак, працює лише у робочих місцях wrt, тобто якщо інший підрозділ не визначає впорядкування, systemd запускає і паралельно, і якщо його початкове завдання закінчиться до того, як ваше стартове завдання закінчиться, воно не буде скасовано (фактично його неможливо скасувати) . Використання After = означає, що інша робота продовжує чекати, поки не закінчиться початкове завдання потрібного підрозділу, і залежно від результату, якщо воно не вдалося, завдання запуску очікування вашого блоку скасовується результатом завдання JOB_DEPENDENCY (чому ви використовуєте жовтий [DEPEND] при завантаженні для таких випадків). Отже, цей ефект недійсності не є адміністративним без використання After =.

Ось чому використання Wants = without After = добре, якщо ви не хочете чекати запуску іншого підрозділу: як там немає інвалідів, так і немає гонки. У цьому випадку це не більше ніж механізм синхронізації.

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

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

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