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.