सवाल लॉगआउट के बाद चलने वाली लिनक्स प्रक्रिया को रखना


मैं एसएसएच के माध्यम से एक लिनक्स मशीन से कनेक्ट कर रहा हूं, और मैं एक भारी बैश स्क्रिप्ट चलाने की कोशिश कर रहा हूं जो फाइल सिस्टम ऑपरेशंस बनाता है। यह घंटों तक चलने की उम्मीद है, लेकिन मेरे पास इंटरनेट कनेक्शन के मुद्दों के कारण एसएसएच सत्र खुला नहीं जा सकता है।

मुझे संदेह है कि पृष्ठभूमि ऑपरेटर के साथ स्क्रिप्ट चल रहा है, एम्परसैंड (&), चाल करेगा, क्योंकि मैंने कोशिश की और बाद में पाया कि प्रक्रिया पूरी नहीं हुई थी। मैं कैसे लॉगआउट कर सकता हूं और प्रक्रिया को चालू रख सकता हूं?


139
2017-09-15 06:00


मूल




जवाब:


टर्मिनल मल्टीप्लेक्सर में प्रक्रिया शुरू करने का सबसे अच्छा तरीका है। वैकल्पिक रूप से आप प्रक्रिया को एचयूपी सिग्नल प्राप्त नहीं कर सकते हैं।


टर्मिनल मल्टीप्लेक्सर "वर्चुअल" टर्मिनलों को प्रदान करता है जो "असली" टर्मिनल से स्वतंत्र होते हैं (वास्तव में आज सभी टर्मिनल "आभासी" हैं लेकिन यह एक और दिन के लिए एक और विषय है)। वर्चुअल टर्मिनल आपके एसएसएच सत्र के साथ बंद होने पर भी चल रहा रहेगा।

वर्चुअल टर्मिनल से शुरू की गई सभी प्रक्रियाएं उस आभासी टर्मिनल के साथ चलती रहेंगी। जब आप सर्वर से पुन: कनेक्ट करते हैं तो आप वर्चुअल टर्मिनल से पुनः कनेक्ट कर सकते हैं और सबकुछ ऐसा होगा जैसे कुछ भी नहीं हुआ, जो पास हुए समय के अलावा।

दो लोकप्रिय टर्मिनल मल्टीप्लेक्सर्स हैं स्क्रीन तथा tmux

स्क्रीन एक सीधी सीखने की वक्र है। अवधारणा को समझाते हुए चित्रों के साथ यहां एक अच्छा ट्यूटोरियल है: http://www.ibm.com/developerworks/aix/library/au-gnu_screen/


HUP टर्मिनल बंद होने पर टर्मिनल द्वारा सिग्नल (या SIGHUP) को अपने सभी बाल प्रक्रियाओं में भेजा जाता है। SIGHUP प्राप्त करने पर सामान्य कार्रवाई समाप्त करना है। इस प्रकार जब आपका एसएसएच सत्र डिस्कनेक्ट हो जाता है तो आपकी सभी प्रक्रियाएं समाप्त हो जाएंगी। इससे बचने के लिए आप अपनी प्रक्रियाओं को SIGHUP प्राप्त नहीं कर सकते हैं।

ऐसा करने के लिए दो आसान तरीके हैं nohup तथा disown

कैसे के बारे में अधिक जानकारी के लिए nohup तथा disown काम इस सवाल को पढ़ता है और उत्तर देता है: https://unix.stackexchange.com/questions/3886/difference-between-nohup-disown-and

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


132
2017-09-15 06:05



मुझे यह जवाब पसंद है क्योंकि यह इंटरैक्टिव और गैर-इंटरैक्टिव स्थितियों दोनों के लिए एक समाधान प्रदान करता है। इंटरैक्टिव मामले में, screen आपको बहुत अधिक विकल्प देता है, लेकिन यदि आप इसका उपयोग कर रहे हैं authorized_keys लोगों को दूरस्थ रूप से एक स्क्रिप्ट चलाने की अनुमति देने के लिए ssh, द nohup विकल्प स्क्रिप्ट के लिए प्रक्रियाओं को शुरू करने का एक अच्छा आसान तरीका है जो लंबे समय तक चलता है ssh सत्र शुरू करने के लिए इस्तेमाल किया। - Mark Booth
@rahmanisback - याद रखें कि आप किसी भी समय अपना स्वीकृत उत्तर बदल सकते हैं। सिर्फ इसलिए कि अब तक एरिकिया का जवाब सबसे ज्यादा वोट दिया गया है इसका मतलब यह नहीं है कि यह आपके लिए सबसे अच्छा जवाब है, वास्तव में यह आपके स्वीकार्य उत्तर को और अधिक लोगों को एक अच्छे उत्तर के रूप में वोट देने के लिए प्रोत्साहित कर सकता है। - Mark Booth
* खांसी * tmuxisbetter * खांसी * - crasic
tmux > स्क्रीन। इसे आज़माएं, आप कभी वापस नहीं जाएंगे। - h0tw1r3
@TheLQ - byobu है जीएनयू स्क्रीन आप अभी भी एक उच्च-अनुकूलित .screenrc के साथ स्क्रीन का उपयोग कर रहे हैं। - EEAA


ऐसा करने के कुछ तरीके हैं, लेकिन मुझे सबसे उपयोगी लगता है कि इसका उपयोग करना है जीएनयू स्क्रीन

दौड़ने के बाद, भागो screen। यह स्क्रीन के भीतर एक और खोल चलाना शुरू कर देगा। अपना आदेश चलाएं, फिर ए करें Ctrl- 

यह आपको स्क्रीन सत्र से "डिस्कनेक्ट" करेगा। इस बिंदु पर, आप लॉग इन कर सकते हैं या कुछ भी कर सकते हैं जो आप चाहें।

जब आप स्क्रीन सत्र से फिर से कनेक्ट करना चाहते हैं, तो बस चलाएं screen -RD शेल प्रॉम्प्ट से (जैसा कि सत्र का उपयोग करने वाले उपयोगकर्ता का उपयोग करता है)।


92
2017-09-15 06:07



बहुत बढ़िया! साफ जवाब, धन्यवाद ... - rahmanisback
स्क्रीन में कमांड का पूरा समूह है, सभी Ctrl-a से शुरू होते हैं। यदि आप केवल एक अतिरिक्त सीखते हैं, तो "Ctrl-a?" से शुरू करें। फिर आप "Ctrl-a c" और "Ctrl-a n" सीखना नहीं चाहेंगे - olafure
@olafure +1, धन्यवाद। ऐसा लगता है कि स्क्रीन मेरे प्राथमिक टूलबॉक्स का होगा। - rahmanisback
tmux > स्क्रीन। इसे आज़माएं, आप कभी वापस नहीं जाएंगे। - h0tw1r3
Tmux के लिए +1। मैंने 5 सप्ताह पहले स्क्रीन छोड़ दी थी। - Bryan Hunt


में bash, द disown कीवर्ड इस के लिए पूरी तरह अनुकूल है। सबसे पहले, पृष्ठभूमि में अपनी प्रक्रिया चलाएं (या तो उपयोग करें &, या ^Z फिर टाइप करें bg):

$ wget --quiet http://server/some_big_file.zip &
[1] 1156

टाइप करके jobs आप देख सकते हैं कि प्रक्रिया अभी भी खोल के स्वामित्व में है:

$ jobs
[1]+  Running  wget

अगर आप इस बिंदु पर लॉग आउट करना चाहते थे, तो पृष्ठभूमि कार्य भी मारेगा। हालांकि, अगर आप भागते हैं disown, बैश नौकरी को अलग करता है और इसे जारी रखने की अनुमति देता है:

$ disown

आप इसकी पुष्टि कर सकते हैं:

$ jobs
$ logout

आप भी गठबंधन कर सकते हैं & तथा disown एक ही पंक्ति पर, जैसे:

$ wget --quiet http://server/some_big_file.zip & disown
$ logout

यह चलने से बेहतर है nohup मेरी राय में क्योंकि यह नहीं छोड़ता है nohup.out फाइलें आपके फाइल सिस्टम पर बिखरी हुई हैं। इसके अलावा, nohup आदेश चलाने से पहले भागना चाहिए - disown यदि आप केवल बाद में निर्णय लेते हैं कि आप पृष्ठभूमि करना चाहते हैं और कार्य को अलग करना चाहते हैं तो इसका उपयोग किया जा सकता है।


70
2017-09-15 12:27



यह एक बहुत अच्छा जवाब है, 1+। नोहुप या स्क्रीन के लिए एकमात्र वरीयता बैश की आजादी होगी, और अन्य शैल के साथ इस्तेमाल किया जा सकता है। लेकिन जब भी मैं बैश का उपयोग कर रहा हूं, मैं आपके दृष्टिकोण पर टिकूंगा। - rahmanisback
हां - यह बैश-विशिष्ट है, क्योंकि बैश एकमात्र खोल है जिसे मैंने कभी भी उपयोग किया है। मुझे आश्चर्य है कि क्या अन्य गोले कुछ भी समान समर्थन करते हैं (यानी बिना किसी अप के पृष्ठभूमि में लॉन्च करना) - अगर कोई अन्य गोले के लिए अन्य उत्तरों पोस्ट कर सकता है तो यह शानदार होगा। - Jeremy Visser
मेरा जवाब देखें कि यह किसी भी sh-lookalike के साथ इसे कैसे किया जाए - w00t
बाद में फैसला करने में सक्षम होने के कारण +1। बस इस पल के लिए मुझे इसकी आवश्यकता थी। विज्ञापित के रूप में काम किया - code_monk


अधिकांश लिनक्स बॉक्स पर उपलब्ध उपकरण नोहप ऐसा करेगा।


37
2017-09-15 06:14



यह अब तक का सबसे सरल जवाब है। किसी भी आउटपुट को स्वचालित रूप से nohup.out पर निर्देशित किया जाता है और बाद में इसकी जांच की जा सकती है। - Julian
नोहप को ज़श की आवश्यकता नहीं है। - Aaron Brown
Nohup सही जवाब है, यह कोई hangup के लिए छोटा है। - Kinjal Dixit
नोहप तब मशीनों पर स्क्रीन पर पाया जाता है, इसलिए आपको पता होना चाहिए कि इसका उपयोग कैसे किया जाए। - Zenon


बस पूरी तरह से होने के लिए, मैं बताऊंगा tmux, जिसमें स्क्रीन के समान मूल विचार है:

टीएमयूक्स का उद्देश्य जीएनयू स्क्रीन जैसे कार्यक्रमों के लिए एक आधुनिक, बीएसडी-लाइसेंस प्राप्त विकल्प होना है। प्रमुख विशेषताओं में शामिल हैं:

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

हालांकि, Google पर खोजना लगभग असीम रूप से आसान है।


27
2017-09-15 06:23



का उपयोग करते हुए "gnu screen" क्योंकि आपकी खोज क्वेरी काफी अच्छी तरह से काम करती है। - gnur
Tmux के लिए +1000! - mbq


जब आप लॉगआउट करते हैं तो प्रक्रियाओं को चलाने के लिए स्क्रीन अधिक है।

प्रयत्न dtach:

dtach सी में लिखा गया एक प्रोग्राम है जो अलग करने की सुविधा का अनुकरण करता है   स्क्रीन, जो एक कार्यक्रम में एक कार्यक्रम को निष्पादित करने की अनुमति देता है   नियंत्रण टर्मिनल से संरक्षित है। उदाहरण के लिए, कार्यक्रम   डीटीएच के नियंत्रण में टर्मिनल से प्रभावित नहीं होगा   किसी कारण से डिस्कनेक्ट किया गया।

dtach लिखा गया था क्योंकि स्क्रीन पर्याप्त रूप से मेरी जरूरतों को पूरा नहीं किया था; मैं   स्क्रीन की अतिरिक्त सुविधाओं की आवश्यकता नहीं है, जैसे एकाधिक के लिए समर्थन   टर्मिनल या टर्मिनल इम्यूलेशन समर्थन। स्क्रीन भी बहुत बड़ी थी,   भारी, और स्रोत कोड था जो समझना मुश्किल था।

स्क्रीन ने पूर्ण स्क्रीन अनुप्रयोगों के उपयोग के साथ भी हस्तक्षेप किया   emacs और ircII, धारा की अत्यधिक व्याख्या के कारण   कार्यक्रम और संलग्न टर्मिनलों के बीच। dtach एक नहीं है   टर्मिनल इम्यूलेशन परत, और कच्चे आउटपुट स्ट्रीम पास करता है   संलग्न टर्मिनलों के लिए कार्यक्रम। एकमात्र इनपुट प्रोसेसिंग जो   dtach प्रदर्शन करता है अलग-अलग चरित्र के लिए स्कैनिंग (जो सिग्नल   कार्यक्रम से अलग करने के लिए dtach) और निलंबन कुंजी प्रसंस्करण   (जो dtach को अस्थायी रूप से प्रभावित किए बिना खुद को निलंबित करने के लिए कहता है   चल रहा कार्यक्रम), और वांछित अगर दोनों दोनों अक्षम कर सकते हैं।

स्क्रीन के विपरीत, dtach में न्यूनतम विशेषताएं हैं, और यह बेहद छोटा है।   यह dtach को बग और सुरक्षा के लिए अधिक आसानी से ऑडिट करने की अनुमति देता है   छेद, और यह उन वातावरणों में सुलभ बनाता है जहां अंतरिक्ष सीमित है,   जैसे बचाव डिस्क पर।


11
2017-09-15 15:06



धन्यवाद। मैं यहाँ सिर्फ dtach के बारे में पोस्ट करने के लिए आया था। टर्मिनल डिटेचमेंट के लिए अब यह मेरी बात है; स्क्रीन बहुत ज्यादा होती है, और हास्यास्पद डिग्री में इनपुट के साथ हस्तक्षेप करती है। तथ्य स्क्रीन को अपने स्वयं के टर्मकैप की जरूरत है बहुत परेशान है। - fluffy


यहां किसी भी खोल प्रक्रिया को डिमनेनाइज़ करने का एक तरीका है, कोई बाहरी प्रोग्राम आवश्यक नहीं है:

( while sleep 5; do date; done ) <&- >output.txt &

जब आप अपना सत्र बंद करते हैं, तो आउटपुट output.txt फ़ाइल द्वारा प्रमाणित के रूप में चलना जारी रहेगा (जिसमें बफरिंग है इसलिए गैर-शून्य दिखाने में कुछ समय लगता है)। परीक्षण के बाद अपने काम को मारना मत भूलना।

तो आपको बस इतना करना है कि वह करीब है और नौकरी की पृष्ठभूमि है। पहले वास्तव में अच्छा होना cd / तो आप एक माउंट पर पकड़ नहीं है।

यह Solaris के तहत सरल sh में भी काम करता है।


9
2017-09-16 16:48



दिलचस्प। यह कुछ उल्लेखनीय प्रश्न उभरा। मैं देख सकता हूं कि आपने एसटीडीआईएन को कुछ भी नहीं सेट किया है - ऑपरेटर? के बीच क्या अंतर है < /dev/null तथा &- ? मुझे लगता है कि एसटीडीआईएन (और अन्य एसटीडीओयूटी और एसटीडीईआरआर) को या तो फाइल सौंपी जा सकती है < file, या एक धारा द्वारा <& stream एसटीडीआईएन के मामले में। क्या यह वही उपयोग होगा < /dev/null उपरोक्त आपके उदाहरण में? और ऑपरेटर करता है - उपरोक्त धारा के रूप में एक शून्य के रूप में संदर्भित करें? - rahmanisback
जब आप x <& - करते हैं, जो फ़ाइल डिस्क्रिप्टर x को बंद करता है। इस मामले में कोई एक्स नहीं है, जो 1 को मानक इनपुट में बैश डिफ़ॉल्ट बनाता है। यदि आप </ dev / null का उपयोग करते हैं तो आप stdin बंद नहीं कर रहे हैं, तो आप इनपुट के रूप में प्रोग्राम में एक खाली फ़ाइल दे रहे हैं। - w00t
और ईमानदार होने के लिए मुझे वास्तव में पता नहीं है कि यह आपके द्वारा चलाए जा रहे चीज़ को क्यों खराब करता है :-) यह काम करता है, हम इसे उत्पादन में उपयोग करते हैं। मुझे उम्मीद थी कि चारों ओर गड़बड़ करते हुए मैं किसी विशेष चीज़ की आवश्यकता के बिना खोल में एक प्रक्रिया को डिमनीकृत कर सकता था - इसलिए मैंने stdin बंद करके शुरू किया और वह पर्याप्त था। मुझे कुछ खोल स्रोतों को पढ़ना चाहिए, लेकिन मुझे लगता है कि अगर आप प्रक्रिया को stdin और पृष्ठभूमि बंद करते हैं, तो यह प्रक्रिया को भी अलग करता है। - w00t
मुझे लगता है कि कारण यह है कि एक SIGHUP (वास्तविक सिग्नल जो शैल मरने पर बच्चे को छोड़ने का कारण बनता है) तब होता है जब माता-पिता की प्रक्रिया अपने बच्चे के स्टडिन हैंडल को बंद कर देती है। हालांकि, अगर stdin प्रारम्भ करता है तथ्य के बाद बंद होने के बजाए, शून्य के रूप में, माता-पिता को SIGHUP को ट्रिगर करने का कोई तरीका नहीं है। अच्छा लगता है, हालांकि - कभी इसके बारे में सोचा नहीं होगा। - Jeremy Visser
@ जेरेमीविसर जो वास्तव में व्यावहारिक लगता है! - w00t


at आदेश इस तरह की स्थिति के लिए उपयोगी हो सकता है। उदाहरण के लिए, टाइप करें:

at now

और फिर आप कमांड या कमांड की श्रृंखला दर्ज कर सकते हैं जो चलाया जाएगा। यदि मशीन पर ई-मेल सही तरीके से स्थापित किया गया है, तो परिणाम आपको ई-मेल किए जाने चाहिए।

के बजाय now, आप एक तिथि के साथ वैकल्पिक रूप से एक समय, या एक समय अभिव्यक्ति जैसे निर्दिष्ट कर सकते हैं now + 15 minutes। देख man at अधिक जानकारी के लिए।


7
2017-09-16 08:23





byobu उबंटू पर स्क्रीन के लिए एक अच्छा फ्रंट एंड है। दबाने से Ctrl-? आपको सभी कीबोर्ड शॉर्टकट की एक सूची मिलती है। यह एक स्टेटस बार जोड़ता है जो सीपीयू लोड, डिस्क स्पेस इत्यादि देखने के लिए उपयोगी हो सकता है। कुल मिलाकर यह एक ऐसा अनुभव प्रदान करता है जिसे मैं टर्मिनल आधारित वीएनसी कनेक्शन के रूप में वर्णित करता हूं।

nohup अपने आउटपुट के साथ पृष्ठभूमि में नौकरी शुरू करने की अनुमति देता है, जो लॉग फ़ाइल में जाता है, जिसे हमेशा आवश्यक नहीं होने पर / dev / null पर रीडायरेक्ट किया जा सकता है।


7
2017-09-15 13:26