我编写了一个自定义 systemd 服务单元及其配套的 shell 脚本来更新Let's Encrypt的证书。运行时一切正常systemctl start letsencrypt-example_com.service
。我希望它每 60 天自动运行一次,因此我编写了一个 systemd 计时器单元。
我systemctl enable letsencrypt-example_com.timer
当时跑了systemctl start letsencrypt-example_com.timer
。计时器似乎启动,但没有启动服务。
# 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)
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
/usr/local/bin/letsencrypt-renew.sh
:
#!/bin/sh
letsencrypt certonly \
--server https://acme-v01.api.letsencrypt.org/directory \
--text \
--email admin@example.com \
--agree-tos \
--rsa-key-size 4096 \
--authenticator webroot \
--webroot-path /srv/files/letsencrypt/www \
$(
for fqdn in $@;
do echo "--domain $fqdn";
done;
) \
--force-renew
Run Code Online (Sandbox Code Playgroud)
/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
Run Code Online (Sandbox Code Playgroud)
/etc/systemd/system/nginx_reload.service
:
[Unit]
Description=reload nginx conf
[Service]
Type=oneshot
ExecStart=/bin/systemctl reload nginx
Run Code Online (Sandbox Code Playgroud)
pan*_*ark 14
虽然计时器单元会自动获得Before=
对它们应该激活的服务的依赖,但它们显然不会自动Requires=
依赖它(这对我来说没有任何意义)。
所以我[Unit]
在计时器单元的部分添加了以下行,现在它按预期启动服务:
Requires=letsencrypt-example_com.service
Run Code Online (Sandbox Code Playgroud)
我还在该部分设置了AccuracySec
(of 10s
) [Timer]
。
归档时间: |
|
查看次数: |
13594 次 |
最近记录: |