Hẹn giờ Systemd không khởi động đơn vị dịch vụ của nó


9

Tình hình

Tôi đã viết một đơn vị dịch vụ systemd tùy chỉnh và tập lệnh shell đồng hành của nó để gia hạn chứng chỉ từ Let Encrypt . Mọi thứ hoạt động tốt khi tôi chạy systemctl start letsencrypt-example_com.service. Tôi muốn nó được chạy tự động cứ sau 60 ngày, vì vậy tôi đã viết một đơn vị hẹn giờ systemd.

Vấn đề

Tôi chạy systemctl enable letsencrypt-example_com.timerrồi systemctl start letsencrypt-example_com.timer. Bộ đếm thời gian dường như bắt đầu nhưng không phải là dịch vụ.

# 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)

Các tập tin

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 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

/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

Nếu tôi đã làm nó ngày hôm nay, tôi có thể đã không tạo nginx_reload.servicevà thêm nó vào letsencrypt-example_com.service instead:PermissionsStartOnly=true ExecStartPost=/bin/systemctl reload nginx
pandark

Câu trả lời:


11

Mặc dù các đơn vị hẹn giờ tự động có được sự Before=phụ thuộc vào dịch vụ mà họ phải kích hoạt , nhưng rõ ràng họ không tự động có sự Requires=phụ thuộc vào nó (điều này không có ý nghĩa gì với tôi).

Vì vậy, tôi đã thêm dòng sau vào [Unit]phần của đơn vị hẹn giờ và bây giờ nó bắt đầu dịch vụ như dự định:

Requires=letsencrypt-example_com.service

Tôi cũng đặt một AccuracySec(của 10s) trong [Timer]phần.


Tôi đã có một bộ đếm thời gian làm việc một thời gian trước đây, sau đó cùng một bộ đếm thời gian dừng lại với cùng một lỗi của bạn; Tôi đã giải quyết bằng cách sử dụng giải pháp này; Tôi nghĩ có gì đó đã thay đổi trong bản nâng cấp systemd ...
Zac
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.