मैं उपयोगकर्ता डेमॉन के रूप में एक गैर रूट उपयोगकर्ता द्वारा शुरू की जाने वाली एक systemd सेवा को कैसे सेटअप करूं?


20

मैंने अपने आर्क-लाइनक्स सिस्टम (2012.09.07) पर सिस्टमड की स्थापना और सेटअप प्रक्रिया को समाप्त कर दिया है। मैंने अनइंस्टॉल किया initscripts(और कॉन्फ़िगरेशन फ़ाइलों को हटा दिया)।

मैं जो करना चाहता हूं वह एक ऐसी सेवा बनाना है जिसे गैर-रूट उपयोगकर्ता द्वारा शुरू और बंद किया जा सकता है। सेवा शुरू करने के लिए एक अलग स्क्रीन सत्र शुरू करना है। हालाँकि मैं चाहता हूं कि हर उपयोगकर्ता उस सिस्टम पर आए जिसने विशेष रूप से उनके लिए एक विशेष उदाहरण शुरू करने के लिए (सक्षम) इस सेवा को शुरू करने के लिए निर्धारित किया है। ऐसा करने के बारे में कोई कैसे जाएगा?

मुझे याद है कि systemd सेवाओं के उपयोगकर्ता उदाहरणों का समर्थन करता है, हालाँकि मैं इस बारे में कोई जानकारी नहीं पा रहा हूँ कि इसे कैसे स्थापित किया जाए, या क्या यह उस चीज़ से संबंधित है जिसे मैं खोज रहा हूँ।

सेवा फ़ाइल जो मैंने सिस्टम के लिए उपयोग की है:

[Unit]
Description=rTorrent

[Service]
Type=forking
ExecStart=/usr/bin/screen -d -m -S rtorrent /usr/bin/rtorrent
ExecStop=/usr/bin/killall -w -s 2 /usr/bin/rtorrent

अद्यतन # 1 :

मैन पेजों के माध्यम से यहां और यहां पढ़ने के बाद , मैं समझता हूं कि सिस्टमड कैसे बेहतर तरीके से काम करता है। विशेष रूप से कि User=और WorkingDirectory=विकल्पों का उपयोग करके सेवा को उपयोगकर्ता के सत्र में शुरू किया जा सकता है। हालांकि समस्या अभी भी है कि उपयोगकर्ता के लिए खुद को नहीं कर सकते हैं रहता है start, stop, enable, या disableसेवा। एक पहुंच से इनकार किया जाता है त्रुटि द्वारा दी गई है systemctl

अद्यतन # 2 :

सबसे पहले, सरलीकरण के लिए और सिस्टमड के उपयोगकर्ता सत्र के बेहतर उपयोग के लिए (अभी भी कुछ अधूरा है) सुविधा, मैंने सोफ़र के उपयोगकर्ता-सत्र-इकाइयों का उपयोग किया और उसकी कॉन्फ़िगरेशन सलाह का पालन किया।

ऐसा लगता है कि DBus (1.6.4-1) के वर्तमान संस्करण में एक बग है जिसमें यह कमांड वेरिएबल DBUS_SESSION_BUS_ADDRESSका उपयोग करके पर्यावरण चर का अर्थ निर्धारित नहीं करता है systemctl --user:

Failed to get D-Bus connection: Unable to autolaunch a dbus-daemon without a $DISPLAY for X11

चर इस तरह दिखना चाहिए:

DBUS_SESSION_BUS_ADDRESS="unix:path=/run/user/USERUID/dbus/user_bus_socket"

जहां USERUID दिए गए उपयोगकर्ता के यूआईडी की जरूरत है।


मुझे लगता है कि कोई भी प्रति उपयोगकर्ता एक अलग सेवा फ़ाइल बना सकता है, और बस इसे सक्षम कर सकता है। हालांकि मैं सिर्फ यह जानना चाहता हूं कि क्या यह संभव हो सकता है जिस तरह से मैंने ऊपर वर्णित किया है।
हंस

पर्याप्त रूप से, मैं sudoउपयोगकर्ताओं के लिए सरल सेटअप कर सकता था और उन्हें, जैसा कि ऊपर मेरी टिप्पणी में बताया गया है, अपनी स्वयं की सेवा फ़ाइल को नियंत्रित करते हैं। हालांकि यह समाधान उपयोगकर्ता को अधिकांश अन्य सेवाओं को भी नियंत्रित करने की अनुमति देगा ...
हंस

यह नहीं होगा, अगर आपने sudoदस्तावेज़ को पढ़ा था - sudoers (5) में कमांड के तर्कों को प्रतिबंधित करने के कई उदाहरण हैं।
ग्रैविटी

जवाबों:


19

सिस्टमड सामान्य रूप से आम उपयोगकर्ताओं को सिस्टम सेवा शुरू करने की अनुमति नहीं देता है। हालांकि यह पोलकिट के माध्यम से पहुंच देने का समर्थन करता है, लेकिन उस हिस्से में अभी भी कुछ कमी है, और आप अभी तक केवल एक विशिष्ट सेवा की अनुमति नहीं दे सकते हैं।

चूँकि rtorrent वास्तव में एक system service नहीं है, और क्योंकि आप चाहते हैं कि प्रत्येक उपयोगकर्ता को rtorrent का अपना उदाहरण हो, systemd के "user" मोड के साथ प्रयोग करें।

जब आप लॉग इन करते हैं, तो सिस्टम आपके लिए एक user@<uid>.serviceसिस्टम यूनिट शुरू करेगा , जो सिस्टमड का एक अलग "-यूजर" उदाहरण लॉन्च करेगा। नई उपयोगकर्ता के systemd इकाई फ़ाइलों दिखाया जाएगा (के साथ शुरू default.targetसे) ~/.config/systemd/user/, /etc/systemd/user/और /usr/lib/systemd/user/


1
थैंक्स ग्रैविटी, वह मूल रूप से वही था जो मुझे याद आ रहा था। हालांकि यह भी एक DBus समस्या के रूप में अच्छी तरह से पता चला है: वहाँ dbuse में एक बग है कि DBUS_SESSION_BUS_ADDRESSएक दिया उपयोगकर्ता के लिए सही वैश्विक चर सेट नहीं करता है लगता है , इसलिए systemctl उपयोगकर्ता सत्र का उपयोग नहीं कर सकते हैं, यह हमारे त्रुटियों। एक बार जब मैंने इस छोटी सी समस्या का पता लगाया, तो बाकी सब खूबसूरती से काम करता है!
हंस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.