Додавання затримки між зупинкою та початком процесу в systemd


10

У мене справді дивне питання systemd. Коли я видам його, systemctl restartвін запустить новий процес до завершення попереднього.

Це можна побачити в журналі, де остаточно повідомлення про закриття ("журнал закриття") реєструється після повідомлення про запуск ("журнал відкриття").

Чи можна додати затримку між зупинкою та початком процесу?


Ніщо не заважає вам бігтиsystemctl stop myservice && sleep 3 && systemctl start myservice
don_crissti

Чому це дивно? Це особливість дизайну, щоб залишити вас у спокої, щоб вирішувати проблеми реального світу. Введіть сон у свій модуль запуску або скористайтеся умовою ExecPre, щоб переконатися, що старий екземпляр повністю втрачено.
Флоріан Хейгл

Відповіді:


13

У своїх системних файлах служби можна встановити опцію RestartSec, щоб додати затримку для перезавантаження. Дивіться приклад нижче:

[Service]
Restart=always
RestartSec=30

Перевірте це посилання, щоб отримати більше прикладів.


1
afaik RestartSecстосується лише служб, налаштованих відповідно до Restart=директиви, і не враховується при виконанніsystemctl restart someservice
don_crissti

1

Здається, RestartSec використовується лише у тому випадку, якщо саме ця послуга перезапускається за допомогою команди restart systemctl.

Наприклад, у мене є дві служби, A і B.

[Unit]
Requires=network-online.target
[Service]
ExecStart=A-stuff
Restart=always

і

[Unit]
Requires=A.service
After=A.service
[Service]
ExecStart=B-stuff
Restart=always
RestartSec=30

Якщо ви перезапустите systemctl B, він працює як очікувалося ... але якщо ви перезапустите systemctl A, обидві служби зупиняються та негайно запускаються знову, без затримки.

Мабуть, Systemd використовує лише значення конфігурації для однієї служби, яку ви вказали, і ігноруючи їх для будь-яких залежностей.

Це не так рідко, як це звучить. Якщо B спілкується з віддаленим сервером, запуск та зупинка швидко можуть закінчитися невдачею через віддалений кінець, який відхиляє клієнта. Але перезапуск A безпосередньо відбуватиметься кожного разу, коли A оновлюється без зміни B.

Ви, ймовірно, можете обійти це, додавши також затримку до А, але вам цього НЕ ПОТРІБНО робити, оскільки це порушує ізоляцію об'єкта, повідомляючи про B, коли це не залежність.

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