क्यों नोहप बैकग्राउंड प्रोसेस को मारा जा रहा है?


10

मैंने एक दूरस्थ सत्र के माध्यम से एक शेल स्क्रिप्ट शुरू करने की कोशिश की, जो कमांड का उपयोग करके पृष्ठभूमि में एक प्रक्रिया शुरू करता है।

nohup python3 run.py > nohup.out &

जब दूरस्थ सत्र बंद हो जाता है, तो यह प्रक्रिया संदेश के साथ मारी जा रही है:

संकेत संकेत पकड़ा गया

SITEUP पकड़ा गया, लेकिन डीमॉनेटाइज़ नहीं हुआ। बाहर निकल रहा है।

मुझे समझ नहीं आया; जब नोह और का उपयोग करके इसे पृष्ठभूमि में शुरू किया गया था तो यह प्रक्रिया क्यों मार रही है ?


1
मैं शेल जॉब कंट्रोल के सभी अप्रत्याशित व्यवहार से भ्रमित हो जाता था। अब मैं सिर्फ इस्तेमाल करता हूं tmuxऔर nohupपूरी तरह से अनदेखा या डिस्क्राइब या बैकग्राउंड टास्क करता हूं ।
सियान रेन

जवाबों:


10

आपका पायथन कार्यक्रम पूर्ववत है nohup

nohupके साथ हैंगअप सिग्नल को अनदेखा करता है SIG_IGNऔर फिर उसी प्रक्रिया में आपके प्रोग्राम को चेन लोड करता है।

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

डिजाइन द्वारा आपका पायथन कार्यक्रम nohupउल्लेखनीय नहीं है । जॉब कंट्रोल शेल और POSIX सेशन / जॉब सिमेंटिक्स वाले सिस्टम पर, आपको जॉब करने की आवश्यकता होती है, disownताकि शेल को इसके बारे में पहले से ही हैंगअप सिग्नल भेजने के बारे में कभी पता न चले।

(यहां तक ​​कि जो कि systemd ऑपरेटिंग सिस्टम पर पर्याप्त नहीं है। क्योंकि systemd लोगों ने अपने यूजर-स्पेस लॉगिन सेशन मेकेनिज्म का एक सुअर का थोड़ा सा कान बनाया है, आपको यह भी सुनिश्चित करने की जरूरत है कि systemd का मैकेनिज्म सिस्टम शटडाउन को सिग्नल करता है, बजाय हैंगअप के। हर लॉगआउट पर लॉगिन सत्र भी किक नहीं कर रहा है।)

आगे की पढाई


3
क्या यह उनका पायथन प्रोग्राम है जो इसे करता है, या क्या यह पायथन इंटरप्रेटर (/ रन-टाइम वातावरण) है जो इसे चुपचाप उनकी पीठ के पीछे करता है?
इलकाचु

इसके अलावा, मैक ओएस पर, एक ssh सत्र से लॉग आउट करना आपको शेल नौकरियों को मारता है, यहां तक ​​कि जब उपयोग करना शुरू किया जाता है nohup; इसके लिए एक उपाय नहीं मिला है
imhotap

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

@ जेडीबीपी मैंने कोशिश की setsid nohup python3 run.py > nohup.out &, सेटिस्डे ने इस मुद्दे को हल कर दिया है। क्या यह एक उचित दृष्टिकोण है?
मोस्टवांटेड मणि
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.