SystemD स्पॉन एन प्रक्रियाओं है?


13

मेरे संगठन में, हमारे पास कई कतार खपत करने वाली श्रमिक प्रक्रियाएँ हैं। वर्तमान में हम उन्हें प्रबंधित करने के लिए सुपरवाइज़र का उपयोग कर रहे हैं, लेकिन यदि कुछ विशेष लाभों के लिए संभव हो तो SystemD का उपयोग करना चाहते हैं। मैं कस्टम इकाइयों को लिखने के साथ काफी अनुभवी हूं, लेकिन मेरे पास तुरंत इसके लिए SystemD भूमि में एक एनालॉग नहीं है।

में SupervisorD प्रलेखन नामक पैरामीटर numprocsविस्तृत जो एक प्रक्रियाओं वे चाहें सेवा के साथ शुरू किया जा करने के लिए की संख्या निर्धारित करने की अनुमति देता है। अगर मुझे 30 प्रक्रियाएँ शुरू करनी हैं, तो यह एक-पंक्ति परिवर्तन है।

क्या SystemD इकाइयों में एक सेटिंग है जो मुझे यह निर्दिष्ट करने की अनुमति देगी कि मैं इनमें से कितने प्रक्रियाएँ शुरू करूँगा?


1
क्या आप एक ही इकाई के कई उदाहरण बनाने की कोशिश कर रहे हैं? यदि हां, तो आप 0pointer.de/blog/projects/instances.html
Munir

जवाबों:


31

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

सबसे पहले, इकाई फ़ाइल। एक फ़ाइल बनाएँ, जैसे /etc/systemd/system/test@.service। महत्वपूर्ण बिट @प्रतीक है।

यह सामग्री की तरह लग सकता है:

[Service]
ExecStart=/bin/sleep 600 %I

[Install]
WantedBy=multi-user.target

फिर systemctl start test@1.service, इसके साथ शुरू करें systemctl start test@2.service
लॉन्च होने वाली प्रक्रियाएँ इस तरह दिखाई देंगी:

root     17222  19   0  0.0  0.0 Ss         00:05 /bin/sleep 600 1
root     17233  19   0  0.0  0.0 Ss         00:02 /bin/sleep 600 2

ध्यान दें कि आपके द्वारा शुरू किए %Iजाने के बाद आपने जो कुछ भी रखा था, उसके साथ प्रतिस्थापित हो गया @

आप सभी 30 को थोड़ा शेल-फू के साथ शुरू कर सकते हैं:

systemctl start test@{1..30}.service

आप किसी भी सामान्य सेवा की तरह बूट पर उन्हें सक्षम कर सकते हैं: systemctl enable test@1.service

 

अब, मुझे उन बातों से मतलब था जो आप प्रबंधन को आसान बनाने के लिए कर सकते हैं: शायद आप test@{1..30}.serviceउन सभी को प्रबंधित करने के लिए उपयोग नहीं करना चाहते हैं । यह थोड़ा अलौकिक है। आप इसके बजाय अपनी सेवा के लिए एक नया लक्ष्य बना सकते हैं।

इसके /etc/systemd/system/test.targetसाथ बनाएँ :

[Install]
WantedBy=multi-user.target

फिर समायोजित करें /etc/systemd/system/test@.serviceताकि ऐसा लगे:

[Unit]
StopWhenUnneeded=true

[Service]
ExecStart=/bin/sleep 600 %I

[Install]
WantedBy=test.target

के साथ पुनः लोड सिस्टमड systemctl daemon-reload(केवल यदि आप इकाई फ़ाइल को संशोधित कर रहे हैं, तो आवश्यक है और इसके पुराने संस्करण को छोड़ें नहीं)। और अब उन सभी सेवाओं को सक्षम करें जिन्हें आप करना चाहते हैं systemctl enable test@{1..30}.service
(यदि आपके पास पहले यह सेवा सक्षम थी WantedBy=multi-user.target, तो निर्भरता समाप्त करने के लिए इसे पहले अक्षम करें)

अब आप क्या कर सकते हैं systemctl start test.targetऔर systemctl stop test.targetहै, और यह शुरू कर देंगे / सभी 30 प्रक्रियाओं बंद करो।
और फिर, आप किसी अन्य इकाई फ़ाइल की तरह बूट में सक्षम कर सकते हैं systemctl enable test.target:।


इस विस्तृत उत्तर के लिए धन्यवाद, मैंने इसे कई दिनों तक खोजा।
अर्नोलेम

1
क्या आप जानते हैं कि यदि प्रक्रिया विफल हो जाती है, तो क्या होगा?
बैस्टियन

@ बस्ती: आप उपयोग कर सकते हैं Restart=on-failuresystemd.serviceअधिक के लिए मैन पेज पढ़ें ।
सिराइड

1

यहाँ एक अजगर स्क्रिप्ट का उपयोग करके मेरा उदाहरण दिया गया है जो एक वर्चुअन में चलता है:

/etc/systemd/system/my-worker@.service

[Unit]
Description=manages my worker service, instance %i
After=multi-user.target

[Service]
PermissionsStartOnly=true
Type=idle
User=root
ExecStart=/usr/local/virtualenvs/bin/python /path/to/my/script.py
Restart=always
TimeoutStartSec=10
RestartSec=10

अक्षम: sudo systemctl enable my-worker\@{1..30}.service

एन कार्यकर्ताओं को सक्षम करें: sudo systemctl enable my-worker\@{1..2}.service

पुनः लोड करें: sudo systemctl daemon-reload

शुरू: sudo systemctl start my-worker@2.service

अवस्था जांच: sudo systemctl status my-worker@1

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