मान लीजिए कि मैं ssh सत्र से प्रक्रियाओं का एक गुच्छा लॉन्च करता हूं। क्या रिमोट मशीन पर चलने वाली प्रक्रियाओं को बनाए रखते हुए ssh सत्र को समाप्त करना संभव है?
मान लीजिए कि मैं ssh सत्र से प्रक्रियाओं का एक गुच्छा लॉन्च करता हूं। क्या रिमोट मशीन पर चलने वाली प्रक्रियाओं को बनाए रखते हुए ssh सत्र को समाप्त करना संभव है?
जवाबों:
आपको आधुनिक विकल्पों की तलाश करनी चाहिए tmux
।
tmux
screen
कई कारणों से श्रेष्ठ है , यहाँ कुछ उदाहरण दिए गए हैं:
अनुशंसा के उत्तर में बताई गई समान कार्यक्षमता प्राप्त करने के लिए screen
, आपको निम्नलिखित कार्य करने होंगे:
tmux
टाइप करके शुरू करेंtmux
tmux
सत्र के अंदर इच्छित प्रक्रिया शुरू करेंtmux
टाइप करके सत्र को छोड़ें / अलग करेंCtrlbd अब आप सुरक्षित रूप से रिमोट मशीन से लॉग इन कर सकते हैं, आपकी प्रक्रिया अंदर ही चलती रहेगी tmux
। जब आप फिर से वापस आते हैं और अपनी प्रक्रिया की स्थिति की जांच करना चाहते हैं, जिसका उपयोग आप tmux attach
अपने tmux
सत्र में संलग्न करने के लिए कर सकते हैं ।
यदि आप कई सत्रों को साथ-साथ चलाना चाहते हैं, तो आपको प्रत्येक सत्र का नाम Ctrl+ bऔर का उपयोग करना चाहिए $
। आप वर्तमान में चल रहे सत्रों की एक सूची प्राप्त कर सकते हैं tmux list-sessions
, अब कमांड के साथ एक रनिंग सत्र संलग्न करें tmux attach-session -t 0
।
tmux
एक सत्र में एक खिड़की को संभालने की तुलना में बहुत अधिक उन्नत चीजें कर सकते हैं। अधिक जानकारी के लिए man tmux
या tmux GitHub पृष्ठ पर एक नज़र डालें । विशेष रूप से, यहाँscreen
और के बीच मुख्य अंतर के बारे में अक्सर पूछे जाने वाले प्रश्न हैं tmux
।
screen -x -r [screenname]
या screen -rx
कम करें । यह आपको एक मौजूदा स्क्रीन उदाहरण संलग्न करने की अनुमति देता है।
Ctrl-b
और उसके बाद d
को छोड़ने के लिए / अलग में tmux
सत्र। निश्चित रूप से यह tmux
मेरे Ubuntu 12.04 के संस्करण के मामले में है ।
tmux detach
टाइप करने के बजाय चलाएंctrl-b d
nohup
सबसे अच्छा तरीका अक्सर सबसे सरल होता है।
nohup long-running-command &
यह विशेष रूप से इसके लिए बनाया गया था, यह भी stdout को लॉग करता है nohup.log
।
man nohup
bg
यदि आप कुछ पहले से चल रहे कार्यों को "पृष्ठभूमि" करना चाहते हैं, तो आपका सबसे अच्छा शर्त Ctrl+ है Zतो चलाएं
bg
अपने सबसे हाल के निलंबित कार्य को पृष्ठभूमि में रखने के लिए, जिससे वह चालू रहे।
फिर एक त्वरित disown
आपको लॉग आउट करने के बाद प्रक्रिया को चालू रखना चाहिए।
screen
और अन्य लोग इसे कर सकते हैं, लेकिन यह वह नहीं है जिसके लिए वे हैं। मैं उन nohup
कार्यों के लिए सलाह देता हूं जिन्हें आप जानते हैं कि आप bg
अपने पहले से चल रहे कार्यों के लिए पीछे छूट जाते हैं और फिर से शुरू नहीं करना चाहते हैं।
ध्यान रखें, दोनों बैश स्पेसिफिक हैं। यदि आप बैश का उपयोग नहीं कर रहे हैं, तो कमांड अलग हो सकते हैं।
disown -h
bg
+ disown
मेरे लिए काम नहीं किया। मेरे पास एक परिनियोजन स्क्रिप्ट चल रही थी जिसे मैं tmux के अंदर शुरू करना भूल गया, और बैठक के लिए जल्दी निकलने की आवश्यकता थी। स्क्रिप्ट लगातार शेल में प्रगति करती है। ctrl+z
प्रक्रिया को रोक दिया, मुझे बैश करने के लिए लौट रहा है। bg
इस प्रक्रिया को फिर से शुरू किया, लेकिन इसने स्थिति को कोसने के लिए फिर से शुरू करना शुरू कर दिया, जिससे यह देखना असंभव हो गया कि मैं क्या टाइप कर रहा था। हालाँकि, एक disown
कमांड ने "
julia myFile.jl
लिए जो भी कारण के साथ काम नहीं किया । tmux करता है और महान है।
आप ऐसा करके उपयोग कर सकते हैं screen
।
man screen
अधिक जानने के लिए लिखें या इस स्क्रीन मैन पेज को पढ़ें ।
सरल परिदृश्य:
अपने दूरस्थ बॉक्स में ssh। टाइप करें screen
फिर अपनी मनचाही प्रक्रिया शुरू करें।
प्रेस Ctrl- Aतो Ctrl- D। यह आपके स्क्रीन सत्र को "अलग" कर देगा लेकिन आपकी प्रक्रियाओं को चालू रखेगा। अब आप दूरस्थ बॉक्स से लॉग आउट कर सकते हैं।
यदि आप बाद में वापस आना चाहते हैं, तो फिर से लॉग ऑन करें और screen -r
यह आपके स्क्रीन सत्र को "फिर से शुरू" टाइप करेगा, और आप अपनी प्रक्रिया का आउटपुट देख सकते हैं।
screen -S name
ताकि बाद में सही से कनेक्ट करना आसान हो सके।
screen -S
पहले छुट्टी के साथ संयोजन और screen -r
जब वापस आना अद्भुत है!
स्क्रीन और नोहप बेहतर तरीका है, लेकिन अगर आपको बिना स्क्रीन या नूप के पहले से चल रही प्रक्रिया को अलग करना है तो आप डिसाइड कमांड चला सकते हैं।
disown [-ar] [-h] [
jobspec
… |
pid
… ]
विकल्पों के बिना, प्रत्येक जॉबस्पेक को सक्रिय नौकरियों की तालिका से हटा दें । यदि
-h
विकल्प दिया जाता है, तो नौकरी को तालिका से नहीं हटाया जाता है, लेकिन इसे चिह्नित किया जाता है, ताकि शेल को एक SIGHUP प्राप्त होने पर नौकरी पर नहीं भेजा जाए। यदि जॉबस्पेक मौजूद नहीं है, और न-a
तो-r
विकल्प की आपूर्ति की जाती है, तो वर्तमान नौकरी का उपयोग किया जाता है। यदि कोई जॉबस्पेक आपूर्ति नहीं करता है, तो-a
विकल्प का मतलब सभी नौकरियों को निकालना या चिह्नित करना है;-r
एक के बिना विकल्प jobspec तर्क नौकरियों चलाने के लिए संचालन प्रतिबंधित करता है।
डिस्ऑन के साथ आप टर्मिनल को बंद कर सकते हैं और मशीन पर चलने वाली प्रक्रिया प्राप्त कर सकते हैं।
disown -a && exit
disown
और इसे कॉल करने से पहले पृष्ठभूमि में शुरू नहीं किया और इसे मार दिया।
मैं एक बड़े एमवी में फंस गया था इसलिए मैं प्रक्रिया, सेटअप स्क्रीन को रोकने और फिर इसे फिर से शुरू करने की स्थिति में नहीं था। मैं निम्नलिखित चरणों में अनिवार्य रूप से चल रही प्रक्रिया के साथ ssh सत्र से बाहर निकलने में कामयाब रहा:
चरण 3 वर्तमान प्रक्रिया को रोक देता है (जैसे मेरे 'mv' कमांड)।
चरण 4 पृष्ठभूमि में रुकी हुई प्रक्रिया डालता है और इसे फिर से शुरू करता है।
चरण 5 आपको प्रक्रिया को बाधित करने देता है। ** नौकरी की सूची प्राप्त करने के लिए jobs
पहले टाइप करें ।
** (बाश मैनुअल से) अस्वीकृत के बारे में:
disown [-ar] [-h] [jobspec ... | pid ... ]
Without options, remove each jobspec from the table of active
jobs. If jobspec is not present, and neither the -a nor the -r
option is supplied, the current job is used. If the -h option
is given, each jobspec is not removed from the table, but is
marked so that SIGHUP is not sent to the job if the shell
receives a SIGHUP. If no jobspec is supplied, the -a option
means to remove or mark all jobs; the -r option without a job‐
spec argument restricts operation to running jobs. The return
value is 0 unless a jobspec does not specify a valid job.
disown
गया है तो अंतर्निहित कमांड सबसे हालिया पृष्ठभूमि की नौकरी पर काम करता है।
कई ssh कनेक्शन पर प्रोग्राम और टर्मिनल स्थिति बनाए रखने के लिए आप दो प्रमुख कार्यक्रमों का उपयोग कर सकते हैं। वे स्क्रीन (अवलंबी, लेकिन दुर्भाग्य से अस्वस्थ हैं। जाहिर तौर पर अब सक्रिय रूप से विकसित हो रहे हैं ) और tmux (नए, सक्रिय रूप से बनाए रखा गया है)। ब्योबू एक सामने का छोर है जो इन प्रणालियों के शीर्ष पर चल सकता है और अतिरिक्त ubuntu स्थिति की जानकारी प्रदान कर सकता है। नई स्थापनाओं पर यह एक बैकएंड के रूप में tmux का उपयोग करेगा, अगर आपके पास byobu की पुरानी स्थापना है और एक मौजूदा कॉन्फिगरेशन है जो पिछले बैकेंड को बनाए रखेगा, यह स्क्रीन या tmux हो।
बायोबु को डेबियन-आधारित मशीन में ऐसा करके कंप्यूटर पर स्थापित किया जा सकता है:
sudo aptitude install byobu
यम का उपयोग करते हुए, आप करते हैं
su -c 'yum install byobu'
अन्य वितरणों पर बायोबू को स्थापित करना भी संभव है।
आप byobu
ssh का उपयोग करके कनेक्ट करने के बाद होस्ट मशीन पर चलाकर बायोबू शुरू कर सकते हैं। यह आपको एक शेल देगा जो इस तरह दिखता है:
आप एक उबंटू मशीन पर बायोबू टर्मिनल का उपयोग -X विकल्प के साथ भी कर सकते हैं और आसानी से पूरी तरह से काम करने वाले बायोबू का उपयोग कर सकते हैं।
टाइप करके बायोबू शुरू करें byobu
।
आप मौजूदा सत्र के भीतर एक नई विंडो बनाने के लिए F2 दबा सकते हैं, विभिन्न खिड़कियों के बीच स्विच करने के लिए F3-F4।
बायोबु के बारे में सबसे अच्छी बात यह है कि, आपको टर्मिनल छोड़ने के लिए वास्तव में टर्मिनल में चल रही प्रक्रियाओं को नहीं मारना है। आप अगली बार आने पर अगली बार स्क्रीन / बाईमॉक्स (बायोबू का कंकाल) भेज सकते हैं और फिर से शुरू कर सकते हैं:
अगली बार जब आप आते हैं, तो बस करते हैं byobu
और जहां आप थे, वहीं वापस हो जाते हैं।
आप विभिन्न बायोबू सत्र भी बना सकते हैं byobu -S session1
। और जब आप वापस आते हैं तो आप उनमें से किसी से भी जुड़ सकते हैं।
आप Byobu का उपयोग करके बहुत कुछ कर सकते हैं। इसका इस्तेमाल करें! कुछ निश्चित गाइड यहाँ , या यहाँ हैं ।
यह प्रक्रिया शुरू होने के बाद आप ऐसा नहीं कर सकते, आपको एक लंबी दौड़ वाली नौकरी चलाने से पहले चीजों को सेट करना होगा।
आप उपयोग कर सकते हैं nohup लेकिन आधुनिक ज्ञान आप अपनी प्रवेश के रूप में स्क्रीन या Byobu उपयोग करें ताकि आप को अलग कर बातें चल छोड़ सकते हैं पता चलता है।
स्क्रीन का यह फायदा है कि आप एक मशीन से अलग कर सकते हैं और दूसरे से रीटैच कर सकते हैं जो काम के दिन के अंत तक चलने वाली लंबी चलने वाली प्रक्रियाओं पर जांच करना चाहते हैं।
यहाँ स्क्रीन के लिए एक उचित गाइडिंग शुरू हो रही है।
बायोबू मेनू के साथ स्क्रीन के शीर्ष पर इंटरफ़ेस का उपयोग करना आसान बनाता है। यह नए ubuntu पर स्क्रीन का वर्तमान कार्यान्वयन भी है। F2 एक नया टर्मिनल F3 / F4 शुरू करने के लिए आगे और पीछे F6 को डिस्कनेक्ट करने के लिए। वास्तव में स्थायी रूप से टर्मिनलों को समाप्त करने के लिए बाहर निकलें टाइप करें।
disown
प्राप्त करने के लिए उपयोग कर सकते हैं । @ बस्सी का जवाब देखें
disown
और अगर बस जरूरत है Ctrl-z
, तो bg
इसे सक्रिय टर्मिनल और पृष्ठभूमि पर लाने के लिए। फिर, disown
।
अरे, जबकि मैं सहमत था कि स्क्रीन सबसे अधिक प्रभावशाली विकल्प है। आप vncserver का उपयोग कर सकते हैं और फिर उस पर प्रक्रिया शुरू कर सकते हैं।
इसके अलावा अगर आपका एकमात्र इंटरस चलने की प्रक्रिया है और इसके नियंत्रण को वापस लेने की आवश्यकता नहीं है, और पूरी तरह से सबसे महत्वपूर्ण है कि आप जानते नहीं थे कि आपको सत्र बंद करने की आवश्यकता होगी और आपके पास पहले से चल रही प्रक्रिया है, तो आप भाग्य के नहीं हैं आप खोल के रूप में बैश का उपयोग करते हैं
सबसे पहले आपको Ctrl + Z टाइप करके बैकग्राउंड में प्रोसेस भेजना होगा, उसके बाद bg% 1 (यह संख्या जॉब नंबर पर निर्भर करती है, आमतौर पर यह 1 है, लेकिन आप कमांड जॉब का उपयोग करके आसानी से सूची खींच सकते हैं)
अंत में कमांड को डिसाइड करें (जॉब के बाद ... बीजी कमांड के साथ ही)
यह आपके शेल और पृष्ठभूमि में प्रक्रिया के बीच माता-पिता-बच्चे के संबंध को हटा देगा, यह आपके शेल को समाप्त होने पर मरने से रोक देगा।
screen
, इस सवाल को पोस्ट-लॉगिन इवेंट, कैसे प्रक्रियाओं को चालू रखने के लिए, लॉग इन करने के बाद, लेकिन उन्हें शुरू करने से पहले रखा गया था। शानदार जवाब, जॉर्ज, आपने वास्तव में मेरी मदद की है! :)
bg
(बिना %1
) अक्सर पर्याप्त होता है, क्योंकि डिफ़ॉल्ट वर्तमान नौकरी है
एक एकल शेल स्क्रिप्ट के लिए जो मेरे पास लंबे समय से चल रहा है, मैं '&' का उपयोग करके पृष्ठभूमि में प्रक्रिया को लॉग इन करूंगा और चलाऊंगा।
उदाहरण:
/path/to/my/script &
मैंने लॉग आउट किया है और अपने SSH सत्र को काट दिया है। जब मैं कुछ समय बाद लॉग इन करता हूं, तो स्क्रिप्ट से निरंतर डेटा संग्रह द्वारा सिद्ध किया गया स्क्रिप्ट अभी भी निष्पादित हो रहा है।
&
यदि आप लॉग आउट करते हैं और अपने SSH सत्र में, प्रक्रिया अभी भी चल रही है, हालांकि आप उस प्रक्रिया का आउटपुट नहीं देख पाएंगे (यदि आपकी स्क्रिप्ट आपको कुछ प्रतिध्वनित करती है) इसे नहीं देखेंगे, लेकिन अगर यह एक फ़ाइल लिखता है तो फ़ाइल वहाँ होगी)
आपको जीएनयू स्क्रीन की जांच करनी चाहिए और देखना चाहिए कि क्या यह आपकी मदद करता है। आपको वास्तविक समय में चलाने के लिए आपको किस तरह से आवेदन करने की आवश्यकता है, इसके आधार पर, यह हल करने की तुलना में अधिक मुद्दों का कारण हो सकता है, लेकिन कम से कम यह आपको अपने सत्र को फिर से शुरू करने की अनुमति देगा जैसे कि आपने इसे कभी नहीं छोड़ा।
कैसे इस्तेमाल करे :
screen
पहली शुरुआत के लिए कमांड का उपयोग करें , परिचय संदेशों के माध्यम से स्क्रॉल करें, आपको एक टर्मिनल सौंपा जाना चाहिए।screen -r
उस सत्र को फिर से शुरू करने के लिए उपयोग कर सकते हैं । आपके पास एक बार में कई अलग-अलग स्क्रीन सत्र हो सकते हैं, इस मामले में आपको उपलब्ध सत्रों की एक सूची दिखाई जाएगी।कई अन्य विकल्प हैं, उदाहरण के लिए विभाजित स्क्रीन, और सभी शॉर्टकट भी पूरी तरह से अनुकूलन योग्य हैं।
सरलतम उत्तर ...
ctrl + z रनिंग प्रोग्राम को सस्पेंड करेगा
"बीजी" इसे पृष्ठभूमि में चलाएगा
disown
या कुछ के साथ nohup
), यह आमतौर पर एसएसएच सत्र की समाप्ति के बाद प्रक्रिया को चालू नहीं रखेगा।
जबकि हर कोई उपयोग करने के लिए कहता है disown
(आपके द्वारा पहले से ही प्रक्रिया शुरू करने के बाद आपके पास एकमात्र विकल्प), nohup
या यहां तक कि कमांड चलाना screen
, जो उपयोगी है यदि आप कमांड से सभी आउटपुट देखना चाहते हैं ... मैं इसका प्रशंसक हूं screen
.. मैंने अभी भी सबसे हाल ही में लिनक्स के मुख्यधारा के वितरण की कोशिश की है और बस पृष्ठभूमि में काम करना और छोड़ना सभी प्रक्रियाओं का कारण नहीं है जो मरने के लिए चल रहे हैं। एक वैश्विक सेटिंग या कुछ होना चाहिए। मैं कुछ सुंदर पुराने सिस्टम (स्लैकवेयर 12) पर यह कोशिश कर रहा हूं और जब तक मैं इसे मैन्युअल रूप से नहीं मारता, तब तक मेरी टेस्ट स्क्रिप्ट चलती रहती है:
shell$ cat > test.pl
#!/usr/bin/perl
while(1){
sleep(1);
}
shell$ perl ./test.pl &
shell$ exit
logout
shell$ ps aux test.pl
mymom 31337 1 0 13:25 ? 00:00:00 perl ./test.pl
shell$
जबकि मैं मानता हूं कि screen
इसे चलाने का सबसे अच्छा तरीका होगा, भले ही मेरी स्क्रिप्ट ने फ़ाइलों को लॉग करने के लिए लिखा हो या जो भी हो .. मुझे कभी भी उपयोग करने की आवश्यकता नहीं है disown -a
या nohup
जब तक कि यह पूर्ण व्यामोह से बाहर न हो। हो सकता है कि कोई व्यक्ति इस बात पर कुछ प्रकाश डाल सकता है कि कैसे डिफ़ॉल्ट रूप से व्यवहार होता है? हो सकता है कि कुछ सिस्टम प्रशासक सिस्टम को ओवरलोड करने से अपने उपयोगकर्ताओं की प्रक्रियाओं को बनाए रखने के लिए बड़े गोले पर चूक को बदल दें?
दुर्भाग्य से, एक समाप्त SSH सत्र के परिणामस्वरूप tmux या स्क्रीन बंद हो सकता है। ऐसा इसलिए है क्योंकि systemd
सत्र से बाहर प्रवेश करने पर किसी भी बच्चे की प्रक्रिया समाप्त हो जाएगी।
आप इस सेटिंग को अपने logind.conf
( /etc/systemd/logind.conf
) में बदल सकते हैं :
KillUserProcesses=no
Https://unix.stackexchange.com/questions/490267 में जवाब देने के लिए धन्यवाद ।
के बजाय :
cmd options;
पहले जोड़ें nohup
:
nohup cmd options &
फिर, आप कंसोल को स्टडआउट द्वारा देख पाएंगे:
tail -f nohup.out