एक साथ कई उदाहरणों को रोकने / शुरू करने के लिए एक वर्चुअल सिस्टमैड सेवा कैसे बनाएं?


12

मैं उपयोग करने वाले ग्राहकों के लिए एक ही वेब ऐप के कई उदाहरणों की मेजबानी करने की योजना बना रहा हूं systemd। मैं उपयोग करने में सक्षम होना चाहता हूं stopऔर startप्रत्येक ग्राहक उदाहरण का उपयोग कर सकता हूं systemd, साथ ही ग्राहक सेवा के पूरे संग्रह को एक ही सेवा के रूप में माना जा सकता है जिसे एक साथ रोका और शुरू किया जा सकता है।

systemdमुझे बिल्डिंग ब्लॉक्स प्रदान करने की आवश्यकता है PartOf, और टेम्पलेट यूनिट फ़ाइलों का उपयोग करने के लिए, लेकिन मैं माता-पिता की सेवा बंद कर देता हूं, बाल ग्राहक सेवा बंद नहीं होती है। मैं इस काम को systemd के साथ कैसे कर सकता हूं? यहाँ मेरे पास अभी तक क्या है।

मूल इकाई फ़ाइल app.service:

[Unit]
Description=App Web Service

[Service]
# Don't run as a deamon (because we've got nothing to do directly)
Type=oneshot
# Just print something, because ExecStart is required
ExecStart=/bin/echo "App Service exists only to collectively start and stop App instances"
# Keep running after Exit start finished, because we want the instances that depend on this to keep running
RemainAfterExit=yes
StandardOutput=journal

नाम की एक यूनिट टेम्प्लेट फ़ाइल app@.service, जिसका उपयोग ग्राहक उदाहरण बनाने के लिए किया जाता है:

[Unit]
Description=%I Instance of App Web Service

[Service]
PartOf=app.service
ExecStart=/home/mark/bin/app-poc.sh %i
StandardOutput=journal

मेरी app-poc.shस्क्रिप्ट (अवधारणा का प्रमाण जो लूप में फ़ाइल को लॉग करने के लिए प्रिंट करता है):

#!/bin/bash
# Just a temporary code to fake a full daemon.
while :
do
  echo "The App PoC loop for $@"
  sleep 2;
done

अवधारणा के प्रमाण के लिए, मुझे सिस्टम यूनिट फ़ाइलें मिली हैं ~/.config/systemd/user

मैं तब टेम्पलेट के आधार पर अभिभावक और एक उदाहरण शुरू करता हूं systemctl --user daemon-reload:

systemctl --user start app
systemctl --user start app@customer.service

उपयोग करने से journalctl -fमैं देख सकता हूं कि दोनों शुरू हो गए हैं और ग्राहक का चलना जारी है। अब II से उम्मीद है कि माता-पिता बच्चे को बंद कर देंगे (क्योंकि मैंने इस्तेमाल किया था PartOf), लेकिन ऐसा नहीं है। इसके अलावा, माता-पिता को शुरू करना बच्चे को उम्मीद के मुताबिक शुरू नहीं कर रहा है।

systemctl --user stop app

धन्यवाद!

(मैं Ubuntu 9.04 का उपयोग कर रहा हूँ systemd 229 के साथ)।


1
"PartOf = आवश्यकता के समान निर्भरता को कॉन्फ़िगर करता है =, लेकिन इकाइयों को रोकने और पुनः आरंभ करने तक सीमित है।" यदि आप काम करना शुरू करना चाहते हैं, तो क्या आपको Requires=इसके बजाय उपयोग करने की आवश्यकता नहीं है ?
sourcejedi

जवाबों:


10

आपको लाइन को स्थानांतरित करने की आवश्यकता है

PartOf=app.service

से बाहर [Service]और में [Unit]खंड, और करने के लिए जोड़ [Unit]के app.serviceग्राहकों की सूची शुरू करने के लिए, जैसे

Wants=app@customer1.service app@customer2.service

या जैसा कि सोर्सजेडी ने टिप्पणियों में कहा, Requires=वही बात। आप PartOfहाथ से शुरू होने वाली सेवाओं को रोकने के लिए रख सकते हैं जो उपरोक्त सूची में नहीं हैं, जैसे systemctl --user start app@customer3.service


मैंने पुष्टि की कि आप सही थे PartOf। धन्यवाद। मैं एक सिम्लिंक के माध्यम से "वांट्स" को संभालना चाहता हूं, जो कि एक नए एक्शन को सिस्टेम के साथ सक्रिय करने के लिए आवश्यक कार्रवाई बन जाती है। मेरे परीक्षण के मामले के लिए: `ln -s /home/mark/.config/systemd/user/app@.service / home / mark / .config / systemd / user / app.service.wants / unity @ foo.service`
मार्क स्टोसबर्ग

14

मुझे पता चला कि यह किस प्रणाली के लिए "लक्ष्य इकाइयाँ" हैं। एक टारगेट यूनिट का उपयोग करने से, मुझे उन लाभों को प्राप्त होता है जो [Service]मुझे ऊपर दिए गए नकली अनुभाग को बनाने की आवश्यकता के बिना चाहिए । एक कार्यशील उदाहरण "लक्ष्य इकाई" फ़ाइल इस प्रकार है:

# named like app.target
[Unit]
Description=App Web Service

# This collection of apps should be started at boot time.
[Install]
WantedBy=multi-user.target

फिर प्रत्येक ग्राहक उदाहरण शामिल होना चाहिए PartOfमें [Unit](@meuh द्वारा उठाई बाहर के रूप में) अनुभाग, और यह भी एक होना चाहिए [Install]कि इतने अनुभाग enableऔर disableविशिष्ट सेवा पर काम करेंगे:

# In a file name like app@.service
[Unit]
Description=%I Instance of App Web Service
PartOf=app.target

[Service]
ExecStart=/home/mark/bin/app-poc.sh %i
Restart=on-failure
StandardOutput=journal

# When the service runs globally, make it run as a particular user for added security
#User=myapp
#Group=myapp

# When systemctl enable is used, make this start when the App service starts
[Install]
WantedBy=app.target

ग्राहक उदाहरण को लाने और लक्ष्य शुरू होने पर इसे शुरू करने के लिए, यह एक बार सक्षम कमांड का उपयोग किया जाता है:

 systemctl enable app

अब इस बिंदु पर मैं उपयोग कर सकते हैं stopऔर startपर app@customerकरने के लिए एक विशिष्ट उदाहरण के लिए, या मैं उपयोग कर सकते हैं start appऔर stop appसभी क्षुधा एक साथ बंद करने के लिए।


स्थिति के बारे में कैसे? मुझे उन सभी सेवाओं की स्थिति प्राप्त करने का एक सरल तरीका नहीं मिल सकता है जो ऐप चाहती थी। मुझे पता है कि मैं कैसे स्क्रिप्ट कर सकता हूं, लेकिन ...
टॉमी कीनटोला

1
मेरा मतलब है कि उस लक्ष्य समूह में उन सभी को सूचीबद्ध किए बिना ऐप्स की स्थिति प्राप्त करना जो कि इसका हिस्सा हैं, वाइल्ड कार्ड या नहीं, अधिमानतः उस समूह के नाम का उपयोग करना और यहां तक ​​कि इसकी क्या देखभाल की जाती है, इसका भी ध्यान नहीं रखा गया।
टॉमी कीनटोला

2
यह इतना आसान नहीं है। वह स्क्रिप्ट किस पैकेट की होगी? हर बार एक नया घटक जोड़ने पर इसे संशोधित करना होगा। भूल जाओ और तैनाती / रखरखाव haywire जाता है। मैं स्पष्ट रूप से चाहता हूँ कि partOf सेटिंग के साथ एक नया पैकेट जोड़ना है, यह दर्शाता है कि यह उस समूह में मौजूद है और फिर कुछ स्क्रिप्ट को संशोधित नहीं करता है । और फिर उस लक्ष्य को रोकना और शुरू करना पहले की तरह काम करता है। यह काम करता है, लेकिन स्थिति उस दायरे से बाहर हो जाती है। मुझे उन इकाइयों की सूची प्राप्त करने का कोई तरीका भी नहीं मिल सकता है जो एक लक्ष्य में रनटाइम मौजूद हैं। यह उपयोग मामला systemd द्वारा कवर नहीं किया गया है।
टॉमी किन्नटोला

2
@TommiKyntola यहां एक बैश वन-लाइनर है जिसे आपको लक्ष्य निर्भरता में बदलाव के रूप में अपडेट करने की आवश्यकता नहीं है:systemctl status $(systemctl list-dependencies --plain otp.target)
मार्क स्टोसबर्ग

2
@TommiKyntola मैं सहमत हूँ कि systemdयहाँ प्रयोज्य में सुधार कर सकता है। मैंने लक्ष्य के लिए बेहतर स्थिति का सुझाव देने के लिए एक सुविधा अनुरोध खोला है
मार्क स्टोसबर्ग
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.