Systemd टाइमर अपनी सेवा इकाई शुरू नहीं कर रहा है


9

परिस्थिति

मैंने लेट्स एनक्रिप्ट से एक प्रमाणपत्र को नवीनीकृत करने के लिए एक कस्टम सिस्टमड सर्विस यूनिट और उसके साथी शेल स्क्रिप्ट को लिखा है । मेरे चलने पर सबकुछ ठीक हो जाता है systemctl start letsencrypt-example_com.service। मैं चाहता हूं कि इसे हर 60 दिनों में स्वचालित रूप से चलाया जाए, इसलिए मैंने एक सिस्टम टाइमर सिस्टम लिखा।

मुद्दा

मैं 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)

फ़ाइलें

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

अगर मैं आज यह किया है, मैं एक नहीं बनाया है nginx_reload.service, और में जोड़ना letsencrypt-example_com.service instead:PermissionsStartOnly=true ExecStartPost=/bin/systemctl reload nginx
— pandark

शायद संबंधित: github.com/systemd/systemd/issues/6680
— nh2

जवाबों:


11

यद्यपि टाइमर इकाइयाँ स्वचालित रूप से Before=उस सेवा पर निर्भरता प्राप्त करती हैं जिसे वे सक्रिय करने वाले हैं , वे स्पष्ट रूप से इस Requires=पर निर्भरता नहीं रखते हैं (जो मेरे लिए कोई मतलब नहीं है)।

इसलिए मैंने [Unit]टाइमर इकाई के अनुभाग में निम्नलिखित पंक्ति जोड़ दी , और अब यह सेवा को आवश्यकतानुसार शुरू करता है:

Requires=letsencrypt-example_com.service

मैंने अनुभाग में एक AccuracySec(का 10s) भी निर्धारित किया है [Timer]।


मेरे पास कुछ समय पहले एक कार्यशील टाइमर था, फिर वही टाइमर आपकी उसी त्रुटि के साथ बंद हो गया; मैंने इस समाधान का उपयोग करके हल किया; मुझे लगता है कि सिस्टमड अपग्रेड में कुछ बदल गया ...
— Zac
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.