Der Systemd-Timer startet seine Serviceeinheit nicht

9

Lage

Ich habe eine benutzerdefinierte systemd-Serviceeinheit und das dazugehörige Shell-Skript geschrieben, um ein Zertifikat von Let's Encrypt zu erneuern . Alles funktioniert gut, wenn ich renne systemctl start letsencrypt-example_com.service. Ich möchte, dass es alle 60 Tage automatisch ausgeführt wird, also habe ich eine systemd-Timer-Einheit geschrieben.

Problem

Ich rannte systemctl enable letsencrypt-example_com.timerdann systemctl start letsencrypt-example_com.timer. Der Timer scheint zu starten, aber nicht der Dienst.

# systemctl status letsencrypt-example_com.timer
Created symlink from /etc/systemd/system/timers.target.wants/letsencrypt-example_com.timer to /etc/systemd/system/letsencrypt-example_com.timer.
# systemctl start letsencrypt-example_com.timer
# systemctl list-timers --all
# systemctl list-timers
NEXT                           LEFT     LAST                           PASSED       UNIT                            ACTIVATES
n/a                            n/a      ven. 2016-05-06 13:10:13 CEST  1h 51min ago letsencrypt-example_com.timer letsencrypt-example_com.service
# systemctl status letsencrypt-example_com.timer
● letsencrypt-example_com.timer - Run letsencrypt-example_com every 60 days
   Loaded: loaded (/etc/systemd/system/letsencrypt-example_com.timer; enabled)
   Active: active (elapsed) since ven. 2016-05-06 15:01:57 CEST; 2min 50s ago
# systemctl status letsencrypt-example_com.service
● letsencrypt-example_com.service - letsencrypt certificat renewal for example.com and subdomains
   Loaded: loaded (/etc/systemd/system/letsencrypt-example_com.service; static)
   Active: inactive (dead)

Dateien

cat /etc/systemd/system/letsencrypt-example_com.service ::

[Unit]
Description=letsencrypt certificat renewal for example.com and subdomains
Requires=nginx_reload.service
Before=nginx_reload.service

[Service]
Type=simple
ExecStart=/bin/sh /usr/local/bin/letsencrypt-renew.sh example.com www.example.com
User=letsencrypt
Group=www-data

/usr/local/bin/letsencrypt-renew.sh ::

#!/bin/sh

letsencrypt certonly \
--server https://acme-v01.api.letsencrypt.org/directory \
--text \
--email [email protected] \
--agree-tos \
--rsa-key-size 4096 \
--authenticator webroot \
--webroot-path /srv/files/letsencrypt/www \
$(
for fqdn in $@;
    do echo "--domain $fqdn";
    done;
) \
--force-renew

/etc/systemd/system/letsencrypt-example_com.timer ::

[Unit]
Description=Run letsencrypt-example_com every 60 days

[Timer]
OnUnitActiveSec=1min
Persistent=true
Unit=letsencrypt-example_com.service

[Install]
WantedBy=timers.target

/etc/systemd/system/nginx_reload.service ::

[Unit]
Description=reload nginx conf

[Service]
Type=oneshot
ExecStart=/bin/systemctl reload nginx
Pandark
quelle
Wenn ich es heute getan hätte, hätte ich möglicherweise keine erstellt nginx_reload.serviceund füge dies hinzu zu letsencrypt-example_com.service instead:PermissionsStartOnly=true ExecStartPost=/bin/systemctl reload nginx
Pandark
Vielleicht verwandt: github.com/systemd/systemd/issues/6680
nh2

Antworten:

11

Obwohl Timer-Einheiten automatisch eine Before=Abhängigkeit von dem Dienst erhalten, den sie aktivieren sollen , haben sie anscheinend nicht automatisch eine Requires=Abhängigkeit davon (was für mich keinen Sinn ergibt).

Also habe ich dem [Unit]Abschnitt der Timer-Einheit die folgende Zeile hinzugefügt , und jetzt wird der Dienst wie beabsichtigt gestartet:

Requires=letsencrypt-example_com.service

Ich habe auch ein AccuracySec(von 10s) in den [Timer]Abschnitt gesetzt.

Pandark
quelle
Ich hatte vor einiger Zeit einen funktionierenden Timer, dann wurde derselbe Timer mit demselben Fehler gestoppt. Ich habe mit dieser Lösung gelöst; Ich denke, etwas hat sich in einem System-Upgrade geändert ...
Zac