यहाँ आम तौर पर पोस्ट नहीं है, लेकिन मैं इस पर अपने बालों को बाहर निकाल रहा हूँ। मेरे पास एक पायथन स्क्रिप्ट है जो लॉन्च होने पर कांटे, और अन्य प्रक्रियाओं का एक गुच्छा शुरू करने के लिए जिम्मेदार है। इस स्क्रिप्ट को स्टार्टअप पर 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 से अनाथ किया जाता है, वे मारे जाते हैं।
simple
या forking
वास्तव में) में से एक है, तो अंतिम उपाय होगा Type=oneshot
, RemainAfterExit=yes
और KillMode=control-group
।
Server.py
कोड के बिना एक समाधान प्रदान करना कठिन है और लॉन्च सेवाओं को कांटा कैसे जाता है (यदि वे कांटा करते हैं) का विवरण। हालांकि, आम तौर पर बोलना, यह एक तत्परता प्रोटोकॉल बेमेल समस्या है।