बैश / ZSH: 'डिसाइड' करना


30

क्या इसे 'अस्वीकृत' करने के बाद गोले की नौकरी की मेज पर एक प्रक्रिया को 'रिटेट' करने का एक तरीका है?

संपादित करें: $ SEARCHENGINE मुझे पूरी तरह से विफल करता है। बहुत अच्छी नहीं लगती।

जवाबों:


16

यह देखते हुए कि कैसे linux जॉब्स और प्रोसेस ओनरशिप काम करता है, मुझे डर है कि प्रक्रिया को फिर से अपनाए बिना, प्रक्रिया को अपनाने में मदद के बिना वास्तव में संभव नहीं है।

एक अभिभावक बच्चे को 'डिसाइड' कर सकता है, जिसे 'इनिट' नाम की प्रक्रिया द्वारा 'अपनाया' जाता है। सिस्टम सुरक्षा किसी को किसी और की प्रक्रियाओं को हथियाने से रोकती है। जब आप इसे भंग कर देते हैं, तो एक प्रक्रिया किसी और (init) को नियंत्रित करने के लिए बन जाती है। आप 'उपयोगकर्ता' के रूप में अभी भी इस प्रक्रिया को मार सकते हैं, लेकिन आप इसे वापस नहीं पा सकते। आपकी प्रक्रिया को वापस करने के लिए init के लिए प्रयास करने का प्रयास करने की संभावना नहीं है, क्योंकि init मेल भी नहीं पढ़ता है।

जैसा कि यह लगता है, यह वास्तव में "ऐसा मत करो!" के जवाब को उबालता है।


1
यह सही नहीं हो सकता है: माता-पिता की प्रक्रिया बच्चे को बाहर निकलने के अलावा अपनाए जाने का कारण नहीं बन सकती है। आपके द्वारा वर्णित व्यवहार को बच्चे की प्रक्रिया (या कर्नेल द्वारा, जो माता-पिता के मरने पर स्वचालित रूप से होता है) में से कुछ को ट्रिगर करना पड़ता है। एक प्रक्रिया स्वेच्छा से एक बच्चे को गोद नहीं ले सकती है लेकिन यह एक को भी नहीं दे सकती है।
गिलेस एसओ- बुराई को रोकना '

1
मैं क्षमाप्रार्थी हूं। मेरी गलती। बहुत अधिक मात्रा में। बैश स्रोत के माध्यम से फिर से चलाएं, बैश अभी भी स्वामित्व बनाए रखता है, लेकिन बच्चे की प्रक्रिया के लिए नीचे जा रहा sighup को रोकता है। इसलिए इसे वापस प्राप्त करना संभव है, लेकिन यह बाश (अभी तक) में नहीं बनाया गया है। किसी कारण से मैं अनाथों और लाशों की कटाई पर अड़ गया।
लोरिक्स

@ लोमिक्स हाँ, लेकिन जब आप उस शेल को छोड़ देते हैं जिससे आप इसे छोड़ देते हैं, तो यह 1 का ppid मिलता है। इसलिए आपका तर्क मान्य है। जब तक वे किसी भी तरह से बाहर निकलने के बारे में नहीं
जानते हैं

1
क्षमा करें, लेकिन यह उत्तर गलत है। बस उपयोग करें reptyr(एक उपयोग उदाहरण के लिए मेरा उत्तर देखें)।
क्रिश्चियन पिसेट

18

हालांकि मुझे लगता है कि यह किसी को भी गलत प्रक्रिया को अस्वीकार करने की दुर्भाग्यपूर्ण स्थिति में मदद नहीं करता है, अगर आप अपने वर्कफ़्लो से डिस्क्राइब करने वाले थे और इसे बदल दें:

https://github.com/nelhage/reptyr

आप किसी भी प्रक्रिया को पुन: लागू करने में सक्षम होंगे (यानी इसे स्क्रीन के अंदर ले जाएं)।


2
ठीक है, मुझे रेपटीर के साथ अपनी विस्मृत प्रक्रिया वापस मिल गई, इसलिए इसने वैसे ही काम किया जैसे कि अन-डिसेबल्ड यूटिलिटी की मुझे तलाश थी।
होवडाल

आप सही कह रहे हैं, @hlovdal: यह उत्तर आधा-गलत है। reptyrसमाधान है, लेकिन इसका उपयोग बंद करने की कोई आवश्यकता नहीं है disown। स्पष्टता के लिए, मैंने एक नया उत्तर लिखा है।
क्रिश्चियन पिसेट्स

11

आप सभी की जरूरत है reptyr। यह GitHub पर रहता है और व्हीज़े के बाद से डेबियन के लिए पैक किया गया है, और शायद अन्य GNU / लिनक्स डिस्ट्रोस के लिए भी। यदि आप इसकी प्रक्रिया आईडी (PID) के साथ इसे लागू करते हैं, तो यह वर्तमान टर्मिनल में आपकी विहित प्रक्रिया को आगे बढ़ा देगा। उदाहरण के लिए:

pgrep -f DISOWNED_PROCESS  # to find out the PID of the disowned process
reptyr PID                 # insert this PID here

2
(sudo apt-get install reptyr) फिर इसे पहले प्रयास में मिला: "कर्नेल ने संलग्न करते समय अनुमति देने से इनकार कर दिया। यदि आपका यूआईडी लक्ष्य से मेल खाता है, तो / proc / sys / कर्नेल / yama / ptrace.scope का मान जांचें। अधिक जानकारी के लिए, देखें। /etc/sysctl.d/10-ptrace.conf "मैंने 1 से 0 दोनों स्थानों में मान को बदल दिया और यह काम कर गया। मैंने उसी उपयोगकर्ता के रूप में एक प्रक्रिया के एक अव्यवस्था और पुनरावृत्ति का परीक्षण किया (ubuntu 14.04 LTS पर ipython नोटबुक)। शायद यह एक अलग वातावरण में विकास के लिए ठीक है ... यकीन है कि परिवर्तन के अंतिम सुरक्षा प्रभाव नहीं हैं। हो सकता है कि विशेषज्ञता वाला कोई व्यक्ति इसमें झंकार कर सकता हो।
FizxMike 20

1

नहीं, माफ करिए। सिद्धांत रूप में, यह संभव होगा, क्योंकि केवल कुछ शेल आंतरिक स्थिति को बदलने से - यह मूल रूप से एक सूची से प्रक्रिया आईडी को हटा देता है, और इसे बहुत अधिक परेशानी के बिना वापस रखा जा सकता है (आपको परीक्षण में थोड़ा सावधान रहना होगा कि reattached pid सही सत्र में है, लेकिन यह अचूक नहीं है)। लेकिन कोई भी सामान्य शेल (बैश, ksh, tsh, zsh) फिर से जोड़ने का एक तरीका नहीं है। (हालांकि zsh के साथ आप लिख सकते हैं jobstates, jobdirsऔर jobtextसाहचर्य सरणियों; मुझे नहीं पता कि आप उस तरीके को कितना प्राप्त कर सकते हैं)

यदि आप चाहते हैं कि शेल अपने स्वामित्व वाली उपप्रजातियों के लिए किए जाने वाले प्रकटीकरण के लिए सिग्नल भेजे, तो आप एक स्टब जॉब लिख सकते हैं, जो तब तक इंतजार करता है जब तक कि वह सिग्नल प्राप्त नहीं कर लेता है और वही प्रक्रिया को सिग्नल भेज देता है। आप भेज सकते हैं SIGSTOPऔर SIGCONTअनुकरण करने के लिए त्याग की प्रक्रिया के लिए Ctrl+ Zऔर bg। इसमें से कोई भी फिर से मालिक के रूप में काफी सुविधाजनक नहीं होगा।


0

क्या हालात हैं? यदि आप अपने टर्मिनल को कुछ समय के लिए वापस लेना चाहते हैं, तो आप इसके बजाय GNU स्क्रीन का उपयोग कर सकते हैं । यह टर्मिनल से प्रक्रिया को बहुत अलग नहीं करता है - स्क्रीन प्रक्रिया के लाभ के लिए एक का अनुकरण करता है - लेकिन आप इसे उस वास्तविक टर्मिनल से संलग्न और अलग कर सकते हैं जिसका आप उपयोग कर रहे हैं। आप एक स्क्रीन को अलग भी कर सकते हैं, लॉग आउट कर सकते हैं, फिर उसी स्क्रीन पर वापस लॉग इन और पुनः संलग्न कर सकते हैं।


6
परिस्थितियां हैं: आपने गलत प्रक्रिया को अस्वीकार कर दिया है और इसे वापस लेना चाहते हैं।
22

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