Как перезагрузить группу сервисов systemd?

12

Я хочу перезагрузить (а не перезапустить!) Группу сервисов после события.

Например, если я обновлю свои SSL-сертификаты, я хочу, чтобы все службы, которые их используют, были перезагружены ( nginxи postfixприходят на ум). Также я не хочу помнить, какие службы на данном сервере используют SSL-сертификаты. Этого должно быть достаточно, чтобы они были сгруппированы, когда они были настроены.

С другой стороны, я бы хотел избежать изменения .serviceфайлов, поставляемых с пакетами, потому что это потребует ручного вмешательства во время обновлений.

Как мне это сделать?

Существует возможность остановить группу служб по запросу , но это сделает их недоступными на секунду или две, или еще хуже - они могут оставаться недоступными до тех пор, пока не будут исправлены. Я не могу себе этого позволить.

sanmai
источник
Я не уверен, как вы развертываете сертификаты, но для большинства автоматических обновлений /opt/letsencrypt/letsencrypt-auto renew --pre-hook "service nginx stop; service postfix stop; service squid stop" --post-hook "service nginx start; service postfix start; service squid start" также есть предварительная и дополнительная ловушка: у certmonger есть команды postave и presave
Джейкоб Эванс
@JacobEvans Вот что я использую! Ранее была проблема в парсере файла конфигурации для certbot: он не разрешал точки с запятой. Поэтому вам пришлось использовать аргумент командной строки или сделать это за один раз. Прямо сейчас все это излишне.
sanmai
если вы измените .serviceфайл как переопределение, вы можете избежать проблемы обновления. sudo systemctl edit foo.serviceбудет хранить ваши изменения, /etc/systemd/system/foo.service.d/override.confа не изменять установленный foo.serviceфайл.
донкихотский

Ответы:

21

Создайте /etc/systemd/system/ssl-reload.targetсо следующим содержанием.

[Unit]
Description=Services which need reloaded with SSL certs are updated.
PropagatesReloadTo=nginx postfix

Затем создайте другой файл: /etc/systemd/system/ssl-reload.path

[Unit]
Description=Restart services which use SSL when the cert directory changes

[Path]
PathChanged=/path/to/your/ssl/certs/dir

[Install]
WantedBy=multi-user.target

Затем:

systemctl enable ssl-reload.path
systemctl start ssl-reload.path

С учетом вышесказанного, после изменения чего-либо в вашем каталоге SSL, нужные сервисы должны быть автоматически перезагружены.

если вам не нужно автоматическое поведение, то не используйте .pathфайл, а просто введите systemctl reload ssl-reload.targetвручную после изменения файлов SSL.

Марк Стосберг
источник