Назад | Перейти на главную страницу

Systemd - Как мне автоматически перезагрузить юнит, когда другая служба onehot запускается по таймеру?

У меня есть два модуля, nginx.service и certbot.service, которые предоставляются соответствующими пакетами Debian:

nginx.service:

[Unit]
Description=A high performance web server and a reverse proxy server
Documentation=man:nginx(8)
After=network.target

[Service]
Type=forking
PIDFile=/run/nginx.pid
ExecStartPre=/usr/sbin/nginx -t -q -g 'daemon on; master_process on;'
ExecStart=/usr/sbin/nginx -g 'daemon on; master_process on;'
ExecReload=/usr/sbin/nginx -g 'daemon on; master_process on;' -s reload
ExecStop=-/sbin/start-stop-daemon --quiet --stop --retry QUIT/5 --pidfile /run/nginx.pid
TimeoutStopSec=5
KillMode=mixed

[Install]
WantedBy=multi-user.target

certbot.service:

[Unit]
Description=Certbot
Documentation=file:///usr/share/doc/python-certbot-doc/html/index.html
Documentation=https://letsencrypt.readthedocs.io/en/latest/
[Service]
Type=oneshot
ExecStart=/usr/bin/certbot -q renew
PrivateTmp=true

И таймер certbot.timer (также предоставляется пакетом certbot deb):

[Unit]
Description=Run certbot twice daily

[Timer]
OnCalendar=*-*-* 00,12:00:00
RandomizedDelaySec=43200
Persistent=true

[Install]
WantedBy=timers.target

Все это работает нормально.

Проблема в том, что мне нужно перезагрузить nginx, когда срабатывает таймер для nginx, чтобы увидеть новые сертификаты (systemctl reload nginx).

Я знаю, что могу systemctl edit certbot.service, и добавить:

[Service]
ExecStartPost=/bin/systemctl reload nginx

Фактически, это то, что я сделал, но это путаница. Есть ли способ добиться этого с помощью собственных зависимостей systemd? Сложность заключается в том, чтобы вызвать только перезагрузку, а не полноценный перезапуск.

Вы можете просто добавить обработчик развертывания (а не обработчик сообщений; вам нужно сделать это только в том случае, если сертификат развернут) непосредственно в конфигурацию certbot для вашего домена в /etc/letsencrypt/renewal/example.com.conf.

в [renewal] раздел, добавьте строку вроде:

deploy_hook = systemctl reload nginx

Вот и все. Вам не нужно делать странные вещи с модулями systemd.