Я хотел бы знать, есть ли способ с помощью Systemd
restart A.service
( After
) при B.service
запуске или перезагрузке (только перезагрузить конфигурацию), если это возможно, без редактирования, B.service
которое установлено и обновлено системой.
A.service
должен запускаться, даже если B.service
он не установлен, отключен или остановлен.
A.service
:
[Unit]
After = B.service network-online.target
Wants = B.service
[Service]
Type=oneshot
ExecStart = /script.sh start
ExecStop = /script.sh stop
RemainAfterExit=yes
[Install]
WantedBy = network-online.target
B.service
:
[Unit]
After=syslog.target network.target
[Service]
Type=forking
ExecStart=/cmd start
ExecStop=/cmd stop
ExecReload=/cmd reload
PIDFile=/var/run/cmd.pid
[Install]
WantedBy=multi-user.target
Overriding vendor settings
это, но это выглядит еще более легким и многообещающим, единственное исключение - я не хочуA
останавливаться, еслиB
остановлюсь, простоA.restart
еслиB.start
, в любом случае, я скоро проведу какой-нибудь тест и посмотрю, есть ли какой-то способ справиться с этим, тогда дам вам знатьPartOf
иRestart=always
вместе?Restart=
документацию, я не уверен, каково поведение соoneshot
службами, но независимо:When the death of the process is a result of systemd operation (e.g. service stop or restart), the service will not be restarted
если я правильно понимаю, остановка B вручную остановит APartOf
это не решение вопроса, все равно наслаждайтесь.PartOf
сRestart=always
? Вы пробовали это?Я не имел никакого контроля над
stop
сPartOf=
, иA
не должны останавливатьсяB
, так что я в конечном итоге с помощью Переопределение параметров поставщика , кажется, работает./etc/systemd/system/B.service.d/override.conf
/cmd
Реализация асинхронная и доступ к ресурсу, к которому/script.sh
тоже нужно обращаться, я не нашел ничего лучшего (пока), чтобы поспать несколько секунд.Я пытался использовать
systemctl [--no-block] try-restart
перед использованием/script.sh
напрямую, но не получилось.источник
man systemd.unit
(или найдите его в Интернете, если оно не установлено) и найдите главу «Переопределение настроек поставщика».На данный момент systemd не охватывает этот senario. Вы не можете достичь этой функциональности только с помощью служебных файлов. Одна из возможностей состоит в том, чтобы перехватить systemctl с помощью сценария оболочки с тем же именем и в этой проверке, чтобы увидеть, собирается ли B.service быть перезапущен или перезагружен, также выполнить соответствующее действие с A.service и, если необходимо, обновить rc.local, чтобы получить правильное состояние при загрузке, а также. У меня есть эта проблема с docker.service и network.service, но я просто всегда перезапускаю их вместе:
Очевидно, что это не будет эффективно, если сама systemd будет манипулировать B.service внутренне (например, через другие служебные файлы).
источник