मैं सिस्टमड सेवाओं को ओवरराइड या कॉन्फ़िगर कैसे करूं?


109

कई sysv init स्क्रिप्ट /etc/defaultने व्यवस्थापक को कॉन्फ़िगर करने की अनुमति देने के लिए एक संबंधित फ़ाइल का उपयोग किया । अपस्टार्ट नौकरियों को .overrideफाइलों का उपयोग करके संशोधित किया जा सकता है । मैं सिस्टम यूनिटों को ओवरराइड या कॉन्फ़िगर कैसे करूं, अब यह सिस्टम Ubuntu में डिफ़ॉल्ट है?


ध्यान दें कि ExecStart=रिक्त प्रविष्टि के साथ सफाई करते समय आप इसके बाद एक टिप्पणी नहीं डाल सकते हैं: इसे ExecStart= # Empty line to clear previous entries.दूसरी ExecStart=प्रविष्टि के रूप में लिया जाएगा और सूची में जोड़ा जाएगा। पुनश्च। मैं अपनी कम प्रतिष्ठा के कारण मुरू के जवाब में टिप्पणी नहीं जोड़ सका।
tysik

जवाबों:


185

systemdइकाइयों में फ़ाइलों का पालन करने की आवश्यकता नहीं है /etc/defaultsystemdआसानी से कॉन्फ़िगर करने योग्य है, लेकिन इसके लिए आवश्यक है कि आप सिस्टमड यूनिट फ़ाइलों के सिंटैक्स को जानें।

पैकेज शिप यूनिट फाइलें आमतौर पर /lib/systemd/system/। इन्हें संपादित नहीं किया जाना है। इसके बजाय, systemdआपको उपयुक्त फ़ाइलों को बनाकर इन फ़ाइलों को ओवरराइड करने की अनुमति देता है /etc/systemd/system/

किसी दी गई सेवा के लिए foo, पैकेज प्रदान करेगा /lib/systemd/system/foo.service। आप इसका उपयोग करके इसकी स्थिति देख सकते हैं systemctl status foo, या इसके लॉग का उपयोग करके देख सकते हैं journalctl -u foo। की परिभाषा में कुछ को ओवरराइड करने के लिए foo, करें:

sudo systemctl edit foo

यह /etc/systemd/systemइकाई के नाम पर एक निर्देशिका बनाता है , और override.confउस निर्देशिका में एक फ़ाइल ( /etc/systemd/system/foo.service.d/override.conf)। आप इस फ़ाइल (या अन्य .confफ़ाइलों /etc/systemd/system/foo.service.d/) का उपयोग करके सेटिंग्स जोड़ या ओवरराइड कर सकते हैं ।

आदेश तर्कों को ओवरराइड करना

gettyउदाहरण के लिए सेवा लें । कहो कि मैं अपने उपयोगकर्ता को TTY2 ऑटोलॉगिन देना चाहता हूं (यह उचित नहीं है, लेकिन सिर्फ एक उदाहरण है)। TTY2 getty@tty2सेवा द्वारा चलाया जाता है ( tty2टेम्पलेट का एक उदाहरण है /lib/systemd/system/getty@service)। ऐसा करने के लिए, मुझे getty@tty2सेवा को संशोधित करना होगा ।

$ systemctl cat getty@tty2
# /lib/systemd/system/getty@.service
#  This file is part of systemd.
#
#  systemd is free software; you can redistribute it and/or modify it
#  under the terms of the GNU Lesser General Public License as published by
#  the Free Software Foundation; either version 2.1 of the License, or
#  (at your option) any later version.

[Unit]
Description=Getty on %I
Documentation=man:agetty(8) man:systemd-getty-generator(8)
Documentation=http://0pointer.de/blog/projects/serial-console.html
After=systemd-user-sessions.service plymouth-quit-wait.service
After=rc-local.service

# If additional gettys are spawned during boot then we should make
# sure that this is synchronized before getty.target, even though
# getty.target didn't actually pull it in.
Before=getty.target
IgnoreOnIsolate=yes

# On systems without virtual consoles, don't start any getty. Note
# that serial gettys are covered by serial-getty@.service, not this
# unit.
ConditionPathExists=/dev/tty0

[Service]
# the VT is cleared by TTYVTDisallocate
ExecStart=-/sbin/agetty --noclear %I $TERM
Type=idle
Restart=always
RestartSec=0
UtmpIdentifier=%I
TTYPath=/dev/%I
TTYReset=yes
TTYVHangup=yes
TTYVTDisallocate=yes
KillMode=process
IgnoreSIGPIPE=no
SendSIGHUP=yes

# Unset locale for the console getty since the console has problems
# displaying some internationalized messages.
Environment=LANG= LANGUAGE= LC_CTYPE= LC_NUMERIC= LC_TIME= LC_COLLATE= LC_MONETARY= LC_MESSAGES= LC_PAPER= LC_NAME= LC_ADDRESS= LC_TELEPHONE= LC_MEASUREMENT= LC_IDENTIFICATION=

[Install]
WantedBy=getty.target
DefaultInstance=tty1

विशेष रूप से, मुझे उस ExecStartलाइन को बदलना होगा , जो वर्तमान में है:

$ systemctl cat getty@tty2 | grep Exec     
ExecStart=-/sbin/agetty --noclear %I $TERM

इसे ओवरराइड करने के लिए, करें:

sudo systemctl edit getty@tty2

और जोड़:

[Service]
ExecStart=
ExecStart=-/sbin/agetty -a muru --noclear %I $TERM

ध्यान दें कि:

  1. मुझे ExecStartइसे फिर से सेट करने से पहले स्पष्ट रूप से स्पष्ट करना था , क्योंकि यह एक एडिटिव सेटिंग है, के समान है After, Environment(एक संपूर्ण के रूप में, प्रति-चर नहीं) और EnvironmentFile, RestartSecया जैसी सेटिंग को ओवरराइड करने का विरोध किया TypeExecStartकेवल Type=oneshotसेवाओं के लिए कई प्रविष्टियाँ हो सकती हैं ।
  2. मुझे उचित अनुभाग हेडर का उपयोग करना था। मूल फ़ाइल ExecStartमें, [Service]अनुभाग में है, इसलिए मेरे ओवरराइड को अनुभाग में भी डालना ExecStartहै [Service]। अक्सर, वास्तविक सेवा फ़ाइल का उपयोग करने पर एक नज़र systemctl catआपको बताएगा कि आपको क्या ओवरराइड करने की आवश्यकता है और यह किस अनुभाग में है।

आमतौर पर, यदि आप एक सिस्टम यूनिट फ़ाइल को संपादित करते हैं, तो इसे प्रभावी होने के लिए, आपको चलाने की आवश्यकता है:

sudo systemctl daemon-reload

हालाँकि, systemctl editस्वचालित रूप से यह आपके लिए करता है।

अभी:

$ systemctl cat getty@tty2 | grep Exec
ExecStart=-/sbin/agetty --noclear %I $TERM
ExecStart=
ExecStart=-/sbin/agetty -a muru --noclear %I $TERM

$ systemctl show getty@tty2 | grep ExecS
ExecStart={ path=/sbin/agetty ; argv[]=/sbin/agetty -a muru --noclear %I $TERM ; ... }

और अगर मैं:

sudo systemctl restart getty@tty2

और प्रेस CtrlAltF2, प्रेस्टो! मुझे उस TTY पर मेरे खाते में लॉग इन किया जाएगा।

जैसा कि मैंने पहले कहा था, getty@tty2एक टेम्पलेट का एक उदाहरण है। तो, क्या होगा अगर मैं उस टेम्पलेट के सभी उदाहरणों को ओवरराइड करना चाहता हूं? यह टेम्पलेट को स्वयं संपादित करके किया जा सकता है (उदाहरण पहचानकर्ता को हटाकर - इस मामले में tty2):

systemctl edit getty@

पर्यावरण पर हावी

/etc/defaultफ़ाइलों का एक सामान्य उपयोग पर्यावरण चर सेट कर रहा है। आमतौर पर, /etc/defaultएक शेल स्क्रिप्ट है, इसलिए आप इसमें शेल भाषा के निर्माण का उपयोग कर सकते हैं। साथ systemd, तथापि, यह नहीं मामला है। आप पर्यावरण चर को दो तरीकों से निर्दिष्ट कर सकते हैं:

एक फ़ाइल के माध्यम से

कहें कि आपने पर्यावरण चर को एक फ़ाइल में सेट किया है:

$ cat /path/to/some/file
FOO=bar

फिर, आप ओवरराइड में जोड़ सकते हैं:

[Service]
EnvironmentFile=/path/to/some/file

विशेष रूप से, यदि आपके /etc/default/grubकार्यों में केवल असाइनमेंट और कोई शेल सिंटैक्स नहीं है, तो आप इसे उपयोग कर सकते हैं EnvironmentFile

Environmentप्रविष्टियों के माध्यम से

निम्नलिखित ओवरराइड का उपयोग करके ऊपर भी पूरा किया जा सकता है:

[Service]
Environment=FOO=bar

हालाँकि, यह कई चर, रिक्त स्थान, आदि के साथ मुश्किल हो सकता है, इस तरह के उदाहरण के लिए मेरे अन्य उत्तरों में से एक पर एक नज़र डालें ।

आगे की पढाई

इस तंत्र के माध्यम से, systemdइकाइयों को ओवरराइड करना बहुत आसान हो जाता है , साथ ही ऐसे परिवर्तनों को पूर्ववत करना (केवल ओवरराइड फ़ाइल को हटाकर)। ये एकमात्र सेटिंग नहीं हैं जिन्हें संशोधित किया जा सकता है।

निम्नलिखित लिंक उपयोगी होंगे:


1
आपको सेवाओं को सेट करने से पहले वैरिएबल को साफ़ करना होगा, न कि ऑन टाइपॉट की सेवाओं के लिए। इससे मेरी समस्या हल हो गई।
कॉलिन

3
@ मेनार्क से @MarkEdington systemd.service(5), पर अनुभाग ExecStart: "जब तक टाइप = ऑनशॉट नहीं होता है, ठीक एक कमांड दी जानी चाहिए। जब ​​टाइप = ऑनशॉट का उपयोग किया जाता है, तो शून्य या अधिक कमांड निर्दिष्ट किया जा सकता है। कमांड एक ही में कई मल्टीपल लाइन प्रदान करके निर्दिष्ट किया जा सकता है। निर्देश या वैकल्पिक रूप से, यह निर्देश एक ही प्रभाव के साथ एक से अधिक बार निर्दिष्ट किया जा सकता है। यदि खाली स्ट्रिंग को इस विकल्प को सौंपा गया है, तो शुरू करने के लिए आदेशों की सूची रीसेट है, इस विकल्प के पूर्व असाइनमेंट का कोई प्रभाव नहीं होगा। "
मुरु ३

1
@ आप sudo rmओवरराइड फ़ाइल और फिर systemctl daemon-reload, या आप कर सकते हैं systemctl editऔर टिप्पणियों के साथ ओवरराइड में सब कुछ बदल सकते हैं । सेवा फाइलों में टिप्पणियाँ शुरू होती हैं #
मुरु

3
@ ओरियनsystemctl revert foo
अयेल

1
तीन तरीकों (ओवरराइड फ़ाइल, पर्यावरण फ़ाइल, पर्यावरण चर) के लिए पूर्वता का क्रम क्या है? यानी, तीनों में परिभाषित एक चर के लिए, कौन सा मूल्य प्रभावी होगा?
निकोलास काकूरोस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.