Добавление задержки между остановкой и запуском процесса в systemd


10

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

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

Есть ли способ добавить задержку между остановкой и началом процесса?


Ничто не systemctl stop myservice && sleep 3 && systemctl start myservice
мешает

Почему это странно? Это особенность дизайна, позволяющая оставить вас в покое для решения реальных проблем. Вставьте спящий режим в запуск вашего модуля или используйте условие ExecPre, чтобы убедиться, что старый экземпляр полностью исчез.
Флориан Хейгл

Ответы:


13

В ваших служебных файлах systemd вы можете установить опцию RestartSec, чтобы добавить задержку для перезапуска. Смотрите пример ниже:

[Service]
Restart=always
RestartSec=30

Проверьте эту ссылку для большего количества примеров.


1
afaik RestartSecприменяется только к службам, настроенным с помощью Restart=директивы, и не учитывается при выполненииsystemctl restart someservice
don_crissti

1

RestartSec, кажется, используется только в том случае, если эта конкретная служба перезапускается с помощью команды systemctl restart.

Например, у меня есть две службы, 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.

Вы, вероятно, можете обойти это, добавив задержку и к A, но вам НЕ НУЖНО делать этого, поскольку это нарушает изоляцию объекта, давая A знать о B, когда это не зависимость.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.