मैं विशिष्ट उपयोगकर्ता के माध्यम से अपनी सिस्टम सेवा कैसे चलाऊं और बूट पर शुरू करूं?


132

मैं सिर्फ Ubuntu सर्वर 14 से संस्करण 15 में अपग्रेड किया गया। मुझे अपग्रेड के बाद काम करने में अपनी upstart स्क्रिप्ट प्राप्त करने में परेशानी हुई, और पढ़ा कि systemd नया डिफ़ॉल्ट है। मैं एक Linux विशेषज्ञ से बहुत दूर हूँ, इसलिए कृपया मुझ पर आसानी से जाएँ :-)

यहाँ क्या मेरे ऊपर स्क्रिप्ट पहले था:

description "NZBGet upstart script"

setuid robert
setgid robert

start on runlevel [2345]
stop on runlevel [016]

respawn

expect fork

script
    exec nzbget -D
end script

pre-stop script
    exec nzbget -Q
end script

सिस्टमड विकी पेज पर अपस्टार्ट के आधार पर , मैंने चीजों को मैप करने के लिए वहां दी गई तालिकाओं का उपयोग किया जितना कि मैं अपनी नई सिस्टमड सर्विस फ़ाइल में कर सकता हूं:

[Unit]
Description=NZBGet Service

[Service]
Type=forking
ExecStart=/usr/local/bin/nzbget -D
ExecStop=/usr/local/bin/nzbget -Q
Restart=on-failure

यह फ़ाइल पर स्थित है /home/robert/.config/systemd/user/nzbget.service। सेवा को मैन्युअल रूप से शुरू करने के लिए, मैं कर रहा हूं:

$ systemctl --user start nzbget

यह बहुत अच्छा काम करता है। हालाँकि, जब मैं अपने SSH सत्र से लॉग आउट करता हूं, तो सेवा बंद हो जाती है। साथ ही, यह बूटअप या उपयोगकर्ता लॉगिन पर शुरू नहीं होता है। मैं चाहता हूं कि यह उसी तरह का व्यवहार करे जैसा कि एक अपस्टार्ट सेवा के रूप में किया गया था: मैं चाहता हूं कि यह बूट पर शुरू हो, लगातार चलाए, और एक विशिष्ट उपयोगकर्ता के रूप में।

इस कॉन्फ़िगरेशन को प्राप्त करने के लिए मुझे क्या करने की आवश्यकता है?

जवाबों:


163

पहली समस्या

आप निर्देशों User=और इकाई फ़ाइल Group=के [Service]अनुभाग में निर्दिष्ट कर सकते हैं ।

दूसरी समस्या

सेवा को बूट पर चलाने के लिए, आपको इसे अपने होम फोल्डर में नहीं रखना चाहिए। इसके बजाय, इसे नीचे रखो /etc/systemd/system/। यह वह फ़ोल्डर है जिसका उपयोग सिस्टम प्रशासक (यानी आप) द्वारा नई सिस्टम-वाइड सेवाओं को जोड़ने के लिए किया जाता है।

अन्य फ़ोल्डरों में शामिल हैं:

  • /usr/lib/systemd/system/पैकेज के लिए अभिप्रेत है जो यूनिट फाइल को स्थापित करना चाहते हैं, हालांकि डेबियन और उबंटू के तहत फ़ोल्डर वास्तव में है /lib/systemd/system/क्योंकि विभिन्न binऔर libफ़ोल्डरों को /usr/अभी तक एक एकीकृत उपसर्ग में विलय नहीं किया गया है।
  • /usr/local/systemd/system/ स्थानीय रूप से संकलित संकुल द्वारा इकाइयों को स्थापित करने के लिए है।

यूनिट का परीक्षण

एक बार यूनिट फ़ाइल उपयुक्त स्थान पर होने के बाद, आप systemctl start <UNIT_FILENAME>हमेशा की तरह टाइप करके यूनिट शुरू करने का प्रयास कर सकते हैं । यह इकाई के पूर्ण पथ को टाइप किए बिना काम करना चाहिए। यदि यह है तो विस्तार को भी निर्दिष्ट नहीं किया जाना चाहिए .service

इकाई को सक्षम करना

इससे पहले कि आप अपनी इकाई को सक्षम कर सकें, आपको एक [Install]अनुभाग जोड़ना होगा , जिसके तहत आपको निर्देश जोड़ना चाहिए WantedBy=multi-user.target। यह निर्देश बूट-अप प्रक्रिया के चरण को निर्दिष्ट करता है जिसके दौरान सेवा शुरू की जानी चाहिए (यदि इसे सक्षम किया गया था)। multi-user.targetअधिकांश सेवाओं के लिए उपयुक्त है।

एक बार जब वह जानकारी जुड़ जाती है, तो आप उपयोग कर सकते हैं systemctl enable <UNIT_FILENAME>, जो इकाई को सक्षम बनाता है, अब से सिस्टमड बना रहा है, इसे निर्दिष्ट चरण पर बूट करने के दौरान स्वचालित रूप से शुरू करें।


यह काम किया। मुझे systemctl enableकमांड में सेवा फ़ाइल नाम के लिए पूर्ण पथ निर्दिष्ट करना था, हालांकि, यह मेरे लिए पहले स्पष्ट नहीं था। साथ ही सक्षम करने से मुझे एक लापता [Install]अनुभाग के बारे में कुछ चेतावनी मिली । मैंने इसे अनदेखा किया, लेकिन मुझे यकीन नहीं है कि यह बूट समय पर शुरू करने की इसकी क्षमता को प्रभावित करेगा।
void.pointer

2
Installचेतावनी वास्तव में बहुत महत्वपूर्ण था। यह बूट पर बिना शुरू नहीं होगी WantedBy=multi-user.targetके तहत [Install]खंड। इसे .serviceफ़ाइल में जोड़ने के बाद , फिर आप कर सकते enableहैं।
void.pointer

4
मैं इतने लंबे समय के लिए जवाब को अप्राप्य छोड़ने के बारे में माफी मांगता हूं। मैंने उस स्थान को ठीक किया जहां इकाई फ़ाइल को जाना चाहिए, [Install]अनुभाग के बारे में लापता जानकारी को जोड़ा । आशा है कि अब यह किसी के लिए भी अधिक उपयोगी है।
यमहो

5
यह तब बहुत आसान हो जाता है जब उपयोगकर्ता नाम को हटा दिया जाता है, अर्थात आपकी सेवा को प्रारूप में फ़ाइल नाम से परिभाषित किया जाता है, something@.serviceफिर enabled की तरह something@username.serviceसेटिंग का User=%iअर्थ है कि उपयोगकर्ता हार्ड-कोडेड नहीं है और कई उपयोगकर्ता समान परिभाषा का उपयोग कर सकते हैं। एक उदाहरण।
Walf

1
अगर मैं इसे नीचे रखूं तो क्या यह शुरू हो जाएगा /etc/systemd/user/?
खुर्शीद आलम

46

आपको सिस्टमड की "यूजर लिंगिंग" कार्यक्षमता का उपयोग करने में रुचि हो सकती है। इसके माध्यम से सक्षम है loginctl enable-linger USERNAME

यह संबंधित उपयोगकर्ता के लिए बूट पर शुरू होने के लिए एक अलग सेवा प्रबंधक का कारण बनता है, इसलिए आपकी उपयोगकर्ता-परिभाषित इकाइयों को ~/.config/systemd/userउठा लिया जाएगा और आपकी सेवा कॉन्फ़िगरेशन के अनुसार बूट और शटडाउन समय पर संसाधित किया जाएगा।

आप systemctl --userसेवा को प्रबंधित करने और कॉन्फ़िगर करने के लिए भी उपयोग कर सकते हैं , जो आपके उपयोगकर्ता के सेवा प्रबंधक पर काम करेगा, न कि किसी सिस्टम में।


6
systemctl --userएक शानदार खोज है। धन्यवाद!
अनवर

@byteborg शायद तुम में योगदान कर सकते unix.stackexchange.com/questions/409900/... ? मुझे उपयोगकर्ता की भाषाई सेवा में PostgreSQL पर निर्भरता की आवश्यकता है, लेकिन डेटाबेस सिस्टम सेवा बनी हुई है, उपयोगकर्ता की नहीं।
मिचेल एफ

1
एक बार सेवाएं चल रही हैं, तो क्या ऐसी कोई तकनीक है जो उपयोगकर्ता को सेवा के लॉग को देखने की अनुमति दे सकती है? एक अप्रभावी उपयोगकर्ता / var / log / syslog को प्राप्त करने में सक्षम नहीं होगा।
MPR

2
ध्यान दें कि systemctl --userहालांकि SSH सत्रों के लिए काम नहीं करता है।
मार्क के।

2
स्वीकृत समाधान होना चाहिए
आकर्षित
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.