सिस्टमड और प्रोसेस स्पॉनिंग


14

यहाँ आम तौर पर पोस्ट नहीं है, लेकिन मैं इस पर अपने बालों को बाहर निकाल रहा हूँ। मेरे पास एक पायथन स्क्रिप्ट है जो लॉन्च होने पर कांटे, और अन्य प्रक्रियाओं का एक गुच्छा शुरू करने के लिए जिम्मेदार है। इस स्क्रिप्ट को स्टार्टअप पर sysvinit के माध्यम से लॉन्च किया गया था, लेकिन हाल ही में मैंने डेबियन जेसी को अपग्रेड किया है इसलिए इसे सिस्टमड के साथ लॉन्च करने के लिए अनुकूलित किया है।

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

जब वाया सिस्टमड लॉन्च किया जाता है, अगर अभिभावक प्रक्रिया से बाहर निकलते हैं, तो बच्चे सभी बाहर निकल जाते हैं (खैर, स्क्रीन है कि वे मरने में लॉन्च होते हैं और मृत के रूप में दिखाई देते हैं?)

आदर्श रूप से मुझे सभी बच्चे प्रक्रियाओं को मारने के बिना मूल स्क्रिप्ट को पुनरारंभ करने में सक्षम होने की आवश्यकता है, क्या कुछ ऐसा है जो मुझे याद आ रही है?

धन्यवाद!

[Unit]
Description=Server commander
After=network.target

[Service]
User=serveruser
Type=forking
PIDFile=/var/Server/Server.pid

ExecStart=/var/Server/Server.py
ExecStop=/bin/kill -s TERM $MAINPID

[Install]
WantedBy=multi-user.target

संपादित करें: यह मेरे लिए संभवतः प्रासंगिक है कि पायथन लिपि अनिवार्य रूप से अपनी बाल प्रक्रियाओं के लिए एक 'नियंत्रक' है। यह केंद्रीय सर्वर से अनुरोध के अनुसार ग्नू स्क्रीन में सर्वर को शुरू और बंद करता है। यह आम तौर पर हमेशा चलता रहता है, यह सेवाओं और निकास को नहीं बढ़ाता है। हालांकि ऐसे मामले हैं जहां मैं बाल प्रक्रियाओं को मारने के बिना स्क्रिप्ट को फिर से लोड करने में सक्षम होना चाहूंगा, भले ही इसका मतलब है कि प्रक्रियाएं बंद करने के लिए अनाथ हैं 1. वास्तव में, यह भी कोई फर्क नहीं पड़ता कि पायथन स्क्रिप्ट ने प्रक्रियाओं को बंद कर दिया। एक माता पिता की प्रक्रिया, अगर यह भी संभव है।

यह कैसे काम करता है की एक बेहतर व्याख्या:

  • Systemd spawns /Server.py
  • Server.py फोर्क और सिस्टमड के लिए पीआईडी ​​फाइल लिखता है
  • Server.py फिर अपने निर्देशों के आधार पर gnu स्क्रीन में सर्वर प्रक्रियाओं को जन्म देता है
  • सर्वर से अनुरोध किए गए किसी भी पुनरारंभ को निष्पादित करने के लिए Server.py जारी है

Systemd के बिना लॉन्च करते समय, Server.py को फिर से शुरू किया जा सकता है और इसे लॉन्च करने वाले gnu स्क्रीन अप्रभावित रहते हैं। Systemd के साथ लॉन्च करते समय, जब Server.py शट डाउन हो जाता है, बजाय उन स्क्रीन प्रक्रियाओं के जिन्हें पीआईडी ​​1 से अनाथ किया जाता है, वे मारे जाते हैं।


1
Server.pyकोड के बिना एक समाधान प्रदान करना कठिन है और लॉन्च सेवाओं को कांटा कैसे जाता है (यदि वे कांटा करते हैं) का विवरण। हालांकि, आम तौर पर बोलना, यह एक तत्परता प्रोटोकॉल बेमेल समस्या है।
intelfx

BTW, की ExecStop=जरूरत नहीं है। स्टॉप पर सिस्टमड की डिफ़ॉल्ट कार्रवाई प्रक्रियाओं को मारना है। आप KillMode=निर्देशन के लिए प्रलेखन पर एक नज़र रखना चाहते हैं ।
intelfx

1
और, अंत में ... अगर कोई उपयुक्त तत्परता प्रोटोकॉल ( simpleया forkingवास्तव में) में से एक है, तो अंतिम उपाय होगा Type=oneshot, RemainAfterExit=yesऔर KillMode=control-group
intelfx

@intelfx अनिवार्य रूप से अजगर स्क्रिप्ट सबप्रोसेस.कॉल का उपयोग करके स्क्रीन में एक सर्वर लॉन्च करता है। यह उससे अधिक जटिल है क्योंकि स्क्रिप्ट को यह बताने के लिए कहीं और से आज्ञा मिलती है कि कौन सी स्क्रीन शुरू करनी है और कौन सी नहीं। जो स्क्रीन उपलब्ध हैं, वे भी गतिशील हैं, इसलिए वे अपने आप में सिस्टमड सेवाएं नहीं दे सकते। आदर्श रूप से मैं इन स्क्रीन को सेवा के हिस्से के रूप में व्यवहार करने के लिए सिस्टमड नहीं चाहता, लेकिन वर्तमान में वे एक ही प्रक्रिया समूह में डंप हो जाते हैं और मास्टर के साथ मर जाते हैं यदि इसकी पुनः शुरुआत होती है।
बोट्सवाना

मेरा कूबड़ यह है कि systemd उस तरह की नियंत्रण प्रक्रिया को "हैंडल" नहीं करता है (यह शुरुआत के समय PID को देखता है, बाद के लोगों को नहीं पहचानता ...): |
रगडपैक

जवाबों:


9

मैं नियंत्रण समूह (डिफ़ॉल्ट) के बजाय प्रक्रिया के लिए KillMode सेट करके इसे ठीक करने में कामयाब रहा। सबको शुक्रीया


ऐसा लगता है कि एक तय से अधिक के आसपास काम के कुछ हालांकि, अन्य जवाब देखें ... यदि आप ऐसा करते हैं और "सिस्टेक्टल स्टॉप" करते हैं, तो यह उन बच्चे की प्रक्रियाओं को नहीं मारेगा जो वे अभी भी चल रहे हैं [?] Systemctl की निगरानी के बाहर?
रोजरपैक

5

मेरे पास एक पायथन स्क्रिप्ट है जो लॉन्च होने पर कांटे, और अन्य प्रक्रियाओं का एक गुच्छा शुरू करने के लिए जिम्मेदार है।

जो इंगित करता है कि आप इसे गलत तरीके से कर रहे हैं। एक पल में इसमें ज्यादा।

जब स्क्रिप्ट बाहर निकलती है तो बच्चे प्रक्रियाएँ अनाथ हो जाती हैं और चलती रहती हैं।

यह सही व्यवहार नहीं है। यदि "मुख्य" प्रक्रिया - इस मामले में आपके द्वारा निर्दिष्ट किए गए बच्चे Type=forkingको छोड़ दिया गया है - बाहर निकलता है, तो सिस्टम को निष्क्रिय करने के लिए सेवा को निष्क्रिय और किसी अन्य स्थिर प्रक्रिया (नियंत्रण समूह में) को समाप्त करने के लिए माना जाता है। ।

कभी-कभी सिस्टम 5 rcस्क्रिप्ट से सिस्टमड में रूपांतरण सीधा नहीं होता है, क्योंकि सिस्टमड के तहत चीजों को करने का सही तरीका काफी अलग है। OpenVPN, या OpenStack, या OSSEC HIDS को करने का सही तरीका systemd में नहीं है, क्योंकि कोई इसे rcस्क्रिप्ट के साथ करेगा । तथ्य यह है कि आपके पास एक स्क्रिप्ट है जो कि फोर्किंग है, फिर पोते-पोतियों की प्रक्रियाओं का एक पूरा भार पैदा करता है, फिर उन पोते-पोतियों को दौड़ते रहने की उम्मीद से बाहर निकलना यह दर्शाता है कि आप उसी तरह की डरावनी घटना को अंजाम दे रहे हैं ossec-control, जैसे कि फोर्किंग के दो कम स्तरों के साथ। यदि आप अपने आप को एक "मास्टर" स्क्रिप्ट लिखने में पाते हैं जो आपके सिस्टम के "सक्षम" भागों के लिए "सक्षम" झंडे की जाँच करता है और बाल प्रक्रियाओं को चलाता है, तो आप वही गलती कर रहे हैं जो भयावह है ossec-control

सिस्टमैड के साथ इस तरह के घर-निर्मित तंत्र आवश्यक नहीं हैं। यह पहले से ही एक सेवा प्रबंधक है। प्रति /unix//a/200365/5132 , सिस्टमड में इसके बारे में जाने का सही तरीका एक सेवा नहीं है जो कुछ निराला और भ्रमित करने वाली कोशिशों के लिए "उप-सेवाएँ" है। यह प्रत्येक बच्चे की प्रक्रिया को अपने आप में पूरी तरह से विकसित प्रणाली सेवा के रूप में होना है। फिर एक सक्षम करता है और निष्क्रिय करता है, और शुरू होता है और बंद हो जाता है, सिस्टम के विभिन्न भागों को सामान्य सिस्टमड नियंत्रण का उपयोग करते हुए। जैसा कि आप OSSEC HIDS मामले में देख सकते हैं, एक साधारण टेम्पलेट सेवा इकाई लगभग सभी को कवर करती है (एक अपवाद /ubuntu//a/624871/43344 ) सेवाओं पर है, जिससे कोई भी ऐसा काम कर सकता है जैसे कि systemctl enable ossec@agentlessd.serviceवैकल्पिक को सक्षम करनाagentlessdसेवा, सिस्टम 5 के साथ जरूरी "भयावह" मास्टर स्क्रिप्ट "तंत्र के लिए किसी भी आवश्यकता के बिना rc

बहुत सारे मामले हैं, शायद ओएसएसईसी एड्स जितना चरम नहीं है, जहां इस तरह के पुनर्विचार आवश्यक हैं। एक्ज़िम और सेंडमेल जैसे एमटीएस दो ऐसे हैं। एक एकल rcस्क्रिप्ट हो सकती है जो कतार धावक, एक SMTP सबमिशन dawmon, और एक SMTP रिले dawmon, जो वास्तव में चलाने के लिए एक कॉन्फ़िगरेशन फ़ाइल में तदर्थ शेल चर का एक गुच्छा के साथ चलाया जाता है। लेकिन सिस्टेम के साथ ऐसा करने का सही तरीका तीन उचित सेवा इकाइयाँ हैं (जिनमें से दो में सॉकेट इकाइयाँ हैं ) और कोई तदर्थ सामान नहीं है, बस सेवा प्रबंधक का नियमित तंत्र है।


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

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

सिस्टमड के पास स्पष्ट सुविधाएं हैं जो रूट एक्सेस की आवश्यकता के बिना सेवाओं को जोड़ने और हटाने की अनुमति देती हैं। "गैर-प्रणालीगत सेवाओं पर भी उपयोग किया जाता है" केवल ऊपर दिए गए तर्कों में से एक है जो अधिक सिस्टमड को जोड़कर तय नहीं किया जा सकता है ... ठीक है, यकीनन, यहां तक ​​कि एक भी हो सकता है। :)
चार्ल्स डफी

0

आप बस माता-पिता को सुला सकते हैं, और स्टॉप टाइम पर इसे मारने के लिए सिस्टमड का इंतजार कर सकते हैं।

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