मैं लॉगआउट करने के बाद एक लिनक्स प्रक्रिया चालू रखना


142

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

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

जवाबों:


135

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


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

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

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

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


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

ऐसा करने के दो आसान तरीके हैं nohupऔर disown

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

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


3
मुझे यह उत्तर पसंद है क्योंकि यह इंटरैक्टिव और गैर-इंटरैक्टिव दोनों स्थितियों के लिए एक समाधान प्रदान करता है। इंटरएक्टिव मामले में, screenआपको बहुत अधिक विकल्प प्रदान करता है, लेकिन यदि आप authorized_keysलोगों को किसी स्क्रिप्ट को दूरस्थ रूप से चलाने की अनुमति देने के लिए उपयोग कर रहे हैं ssh, तो nohupविकल्प स्क्रिप्ट के लिए एक अच्छा सरल तरीका है प्रक्रियाओं को शुरू करने के लिए जो sshउन्हें शुरू करने के लिए उपयोग किए गए सत्र से अधिक समय तक रहता है। ।
मार्क बूथ

1
@ ब्राह्मणीबैक - याद रखें कि आप किसी भी समय अपना स्वीकृत उत्तर बदल सकते हैं। सिर्फ इसलिए कि अब तक एरिकए के जवाब को सबसे अधिक वोट दिया जाता है, इसका मतलब यह नहीं है कि यह आपके लिए सबसे अच्छा जवाब है, वास्तव में यह आपके स्वीकृत उत्तर को और अधिक लोगों को एक अच्छे उत्तर के रूप में वोट करने के लिए प्रोत्साहित कर सकता है।
मार्क बूथ

3
* खांसी * tmuxisbetter * खांसी *
crasic

3
tmux > स्क्रीन। इसे आज़माएं, आप कभी पीछे नहीं हटेंगे।
h0tw1r3

1
@TheLQ - Byobu है जीएनयू स्क्रीन। आप अभी भी स्क्रीन का उपयोग कर रहे हैं, बस एक अत्यधिक-अनुकूलित .rcrc के साथ।
21

92

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

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

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

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


6
स्क्रीन में कमांड का एक पूरा गुच्छा है, सभी Ctrl-a से शुरू होते हैं। यदि आप केवल एक अतिरिक्त सीखते हैं, तो "Ctrl-a" से शुरू करें। फिर आप "Ctrl-a c" और "Ctrl-a n"
सीखना नहीं चाहेंगे

@olafure +1, धन्यवाद। ऐसा लगता है कि स्क्रीन मेरे प्राथमिक टूलबॉक्स की होने जा रही है।
doc_id

tmux > स्क्रीन। इसे आज़माएं, आप कभी पीछे नहीं हटेंगे।
h0tw1r3

Tmux के लिए +1। मैंने 5 हफ्ते पहले स्क्रीन छोड़ दी थी।
ब्रायन हंट

73

में 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चाहिए - यदि आप केवल बाद में यह निर्णय लेते हैं कि आप पृष्ठभूमि को देखना चाहते हैं और कार्य को अलग कर सकते हैं।


1
यह एक बहुत अच्छा जवाब है, 1+। नॉहप या स्क्रीन के लिए एकमात्र प्राथमिकता बैश की स्वतंत्रता होगी, और इसका उपयोग अन्य शेल के साथ किया जा सकता है। लेकिन जब भी मैं बैश का उपयोग कर रहा हूं, मैं आपके दृष्टिकोण पर टिकूंगा।
doc_id

हाँ - यह बैश-विशिष्ट है, क्योंकि बैश एकमात्र शेल है जिसका मैंने कभी उपयोग किया है। मुझे आश्चर्य है कि अगर अन्य गोले कुछ इसी तरह का समर्थन करते हैं (अर्थात बिना नोक के पृष्ठभूमि में लॉन्च करना) - यह शानदार होगा यदि कोई अन्य गोले के लिए अन्य उत्तर पोस्ट कर सकता है।
जेरेमी विसर

1
मेरे उत्तर को किसी भी श-लुकलॉजी के साथ कैसे करें, यह दिखाते हुए देखें
w00t

1
+1 बाद में निर्णय लेने में सक्षम होने के कारण। बस इसी क्षण मुझे इसकी आवश्यकता थी। विज्ञापित के रूप में काम किया
code_monk

37

अधिकांश लिनक्स बक्सों पर उपलब्ध टूल नोह, यह करेगा।


1
यह अब तक का सबसे सरल उत्तर है। किसी भी आउटपुट को स्वचालित रूप से nohup.out पर निर्देशित किया जाता है और बाद में जांच की जा सकती है।
जुलियन

3
nohup को zsh की आवश्यकता नहीं है।
एरोन ब्राउन

nohup सही उत्तर है, यह hangup के लिए छोटा है।
किंजल दीक्षित

2
nohup अभी तक अधिक मशीनों स्क्रीन पर पाया जाता है, इसलिए आपको पता होना चाहिए कि इसका उपयोग कैसे करना है।
ज़ेनॉन

27

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

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

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

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


2
"gnu screen"आपकी खोज क्वेरी के रूप में उपयोग करना काफी अच्छी तरह से काम करता है।
gnur

4
Tmux के लिए +1000!
mbq

11

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

Dtach आज़माएं :

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

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

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

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


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

9

यहां किसी भी शेल प्रक्रिया को निष्क्रिय करने का एक तरीका है, किसी बाहरी कार्यक्रम की आवश्यकता नहीं है:

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

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

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

यह सोलारिस के तहत सरल श में भी काम करता है।


दिलचस्प। यह कुछ उल्लेखनीय प्रश्न हैं। मैं देख सकता हूं कि आपने कुछ भी नहीं, -ऑपरेटर को STDIN सेट किया है ? बीच क्या अंतर है < /dev/nullऔर &-? मुझे लगता है कि STDIN (और अन्य STDOUT और STDERR) को या तो एक फाइल सौंपी जा सकती है < file, या <& streamSTDIN के मामले में एक स्ट्रीम । क्या < /dev/nullऊपर दिए गए उदाहरण में इसका उपयोग किया जाएगा ? और क्या -उपरोक्त ऑपरेटर धारा के रूप में एक अशक्त को संदर्भित करता है?
doc_id

जब आप x <& - करते हैं, तो यह फाइल डिस्क्रिप्टर x को बंद कर देता है। इस स्थिति में कोई x नहीं है, जो bash को 1 अर्थात मानक इनपुट के लिए डिफ़ॉल्ट बनाता है। यदि आप </ dev / null का उपयोग करते हैं, तो आप स्टड बंद नहीं कर रहे हैं, तो आप प्रोग्राम को इनपुट के रूप में एक खाली फ़ाइल दे रहे हैं।
w00t

1
और सच कहूं तो मुझे वास्तव में नहीं पता कि यह आपके द्वारा चलाए जा रहे चीज़ को क्यों निष्क्रिय करता है :-) यह काम करता है, हालांकि, हम इसे उत्पादन में उपयोग करते हैं। मुझे यह पता चलता है कि मैं उम्मीद कर रहा था कि मैं किसी विशेष चीज की आवश्यकता के बिना शेल में एक प्रक्रिया का उपयोग कर सकता हूं - इसलिए मैंने स्टड को बंद करके शुरुआत की और यह पर्याप्त था। मुझे कुछ शेल स्रोतों को पढ़ना चाहिए लेकिन मैं मानता हूं कि यदि आप स्टड को बंद करते हैं और प्रक्रिया को पृष्ठभूमि देते हैं, तो यह प्रक्रिया को भी समाप्त कर देता है।
w00t

2
मुझे लगता है कि इसका कारण यह है कि एक SIGHUP (वास्तविक संकेत जिसके कारण बच्चा तब मर जाता है जब शेल मर जाता है) ट्रिगर हो जाता है जब एक अभिभावक प्रक्रिया अपने बच्चे के स्टड हैंडल को बंद कर देती है। हालांकि, अगर stdin से शुरू होती है के रूप में अशक्त, बजाय इस तथ्य के बाद बंद किया जा रहा है, वहाँ माता-पिता के लिए कोई रास्ता नहीं SIGHUP को गति प्रदान करने के लिए है। हालांकि, अच्छा लगा - ऐसा कभी नहीं सोचा होगा।
जेरेमी विज़सर

@JeremyVisser जो वास्तव में प्रशंसनीय लगता है!
w00t

7

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

at now

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

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


7

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

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

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