वर्तमान में SSH से लॉगआउट के बाद मारे जाने वाले Linux कार्य को रोकें


18

मेरे पास एसएसएच कनेक्शन के माध्यम से एक लिनक्स सर्वर पर कुछ दिनों के लिए कम्प्यूटेशनल कार्य चल रहा है। यह पृष्ठभूमि पर नहीं है, इसलिए एसएसएच कनेक्शन कार्य के अधीन है।

मैं स्थानीय मशीन (सर्वर नहीं) को पुनरारंभ करना चाहता हूं, जहां से मैंने ssh सत्र खोला है, लेकिन कार्य को चालू रखना चाहता हूं। क्या यह संभव है?

जवाबों:


22

यदि आपका कार्य पहले से ही शुरू है, तो *वैकल्पिक समाधानों पर विचार करने में बहुत देर हो चुकी है जो आपके बीच एक अतिरिक्त परत डालते हैंssh सत्र और शेल कमांड चल रहा है, जैसे screen, tmux, byobu, nohupऔर पसंद।

यदि आपकी प्रक्रिया का समर्थन पृष्ठभूमि में रखा जाना है और विशेष रूप से कब stdoutऔर कैसे लटका नहीं हैstderr यह अपरिवर्तनीय / बंद है, तो आप इसे लॉग आउट करने से पहले पृष्ठभूमि में रख सकते हैं ControlZऔर bgफिर इसे अपने शेल से disownबिलिन के साथ अलग कर सकते हैं ।

उदाहरण के लिए:

$ ssh localhost
You have new mail.
Last login: Fri Jun  6 11:26:56 2014

$ /bin/sleep 3600    


^Z[1] + Stopped                  /bin/sleep 3600
$ bg
[1] /bin/sleep 3600&
$ jobs
[1] +  Running                 /bin/sleep 3600
$ disown %1
$ exit
Connection to localhost closed.
$ ps -ef|grep sleep
jlliagre 12864     1  0 21:12 ?        00:00:00 /bin/sleep 3600
jlliagre 13056 12477  0 21:13 pts/18   00:00:00 grep sleep
$ 

*जैसा कि बॉब ने टिप्पणी की है, वास्तव में लिनक्स के तहत एक छोटे सत्र को पुन: प्रस्तुत करने के कई हैकिश तरीके हैं। रिफ्टी, रिट्टी , इंज्वॉय और नार्क्स । सबसे उन्नत लग रहा है reptyr लेकिन आप अपनी प्रक्रिया को हैक करने के लिए ptrace सक्षम करने के लिए रूट विशेषाधिकार की आवश्यकता हो सकती है।


मैंने Ctrl + Z का उपयोग किया, नौकरी बंद हो गई और पृष्ठभूमि में चली गई, फिर disownकमांड का प्रदर्शन किया । यह वापस आ गया: bash: चेतावनी: प्रक्रिया समूह 24876 के साथ रुकी हुई नौकरी 1 को हटाना। अब मेरी नौकरी सूचीबद्ध है ps -allलेकिन काम नहीं कर रहा है (CPU उपयोग 0% है)
Ali

लगता है मेरी प्रक्रिया रोक दी गई है। मुझे लगता है कि मुझे disownप्रॉम्प्ट आईडी प्रदान करनी चाहिए थी
अली

@ मुझे लगता है कि आप निलंबित नौकरी को फिर से शुरू करने के लिए बीजी कमांड चलाना भूल गए।
जेसन झू

1
@JasonZhu यह इंगित करने के लिए धन्यवाद। यह स्पष्ट नहीं था कि bgमेरे उत्तर के पहले भाग में कमांड की आवश्यकता थी। संपादित।
jlliagre

2
यदि आप bg कमांड को भूल गए हैं और केवल डिसऑर्डर कमांड को रन किया है, तो आपको उस प्रक्रिया को फिर से चलाने में सक्षम होना चाहिए kill -CONTजिसके साथ लगभग वही होता है जो bg होता है।
कैस्पर

5

एक समाधान GNU स्क्रीन का उपयोग करना है । आप शुरू कर सकते हैं screen, अपनी कमांड चला सकते हैं, फिर से अलग कर सकते हैं C-a d। बाद में, पुन: कनेक्ट करने के लिए, करें screen -r, और आप अपने पिछले सत्र में वापस आ गए हैं।

स्क्रीन के अन्य लाभ विंडो प्रबंधन हैं (ताकि आप एक नए SSH कनेक्शन की आवश्यकता के बिना, अपने कमांड को चलाने के दौरान अन्य गोले में स्विच कर सकें), और यह आपके कमांड को अग्रभूमि में रहने की अनुमति देता है, चाहे वह वर्तमान सत्र में हो या बाद में।

संपादित करें: जैसा कि टिप्पणियों में कहा गया है, यह केवल तभी काम करेगा जब आप screenकमांड चलाने से पहले शुरू करना याद रखें । यदि कमांड पहले से चल रही है, तो आपको @ jlliagre के समाधान की आवश्यकता होगी।


2
tmuxएक अन्य कार्यक्रम है screenजो आपको एक दूरस्थ सत्र रखने की अनुमति देता है जो आपके वर्तमान एसएसएच कनेक्शन से बंधा नहीं है।
डार्थ Android

2
आपका समाधान महान है। हालाँकि यह मेरे सवाल पर पूरी तरह से फिट नहीं बैठता है - मैंने वर्तमान में चल रही प्रक्रिया के बारे में पूछा, भविष्य में उपयोग करने के लिए एक प्रक्रिया नहीं screen
अली

आह ठीक है। उस स्थिति में, मुझे लगता है कि आपको @ jlliagre के समाधान का उपयोग करने की आवश्यकता होगी। (जहाँ तक मुझे पता है, वहाँ एक रास्ता की तरह कुछ करने के लिए एक पहले से ही चल रहा है प्रक्रिया कनेक्ट करने के लिए नहीं है screenया tmux।)
स्कॉट वेल्डन

1

ऐसा करने के लिए "मानक" तरीकों nohupमें से एक coreutils, इस तरह से शामिल कमांड का उपयोग करना है :

nohup COMMAND [ARGS] &

लेकिन कमांड प्रोग्राम के आउटपुट ( STDOUTऔर STDERRAFAIK) को एक फाइल में रीडायरेक्ट करेगा nohup.out, जिससे यह किसी भी तरह कभी-कभी परेशान हो सकता है (जैसे कि एक विशाल लॉग फ़ाइल उत्पन्न करना), इसलिए आप अपना स्वयं का पुनर्निर्देशन करना चाहते हैं, या इसे / dev / null पर रीडायरेक्ट कर सकते हैं। अगर तुम चाहते हो।


2
दोबारा पढ़ें। प्रक्रिया पहले से ही चल रही है
मोनिका

/ शर्म नहीं आई ध्यान से पढ़ें माफ़ करना।
वांगगुओकिन 1001

वास्तव में nohupइसके लिए इस्तेमाल किया जा सकता है। बस चल रही प्रक्रिया को स्थगित करें और इसे पृष्ठभूमि ( Ctrl+ Zऔर रन bg) पर भेजें और फिर आप जारी कर सकते हैं nohup %1
माइक

0

इसके अलावा nohupआप "और" का उपयोग करके पृष्ठभूमि में प्रक्रिया को लॉन्च कर सकते हैं और सब्सक्राइब कर सकते हैं:

इसके साथ कमांड को सफ़िक्स करें और इसे कोष्ठक में लपेटें

$ (thecommand args &)

कहते हैं कि आपकी प्रक्रिया 1922 को लाभ देती है:

$ ps -f
UID        PID  PPID  C STIME TTY          TIME CMD
usr      11473  2643  0 15:07 pts/1    00:00:00 bash
usr      11922     1  0 15:11 pts/1    00:00:00 thecommand

देखें कि यह शेल प्रक्रिया 11473 से अनासक्त है जो कि इसका मूल अभिभावक था। इसलिए, यदि आप मौजूदा शेल (11473) से बाहर निकलते हैं या मारते हैं, तो प्रक्रिया 11922 चलती रहती है, और इसे पीटीएस से डिस्कनेक्ट कर दिया जाएगा।

शेल से बाहर निकलने की कोशिश करें, और एक नए शेल में प्रवेश करें। यहां तक ​​कि अगर, यह शेल एक ही पीटीएस से जुड़ा हुआ है, तो आप प्रक्रिया को बिना पीटी के देख सकते हैं:

$ ps -fp 11922
UID        PID  PPID  C STIME TTY          TIME CMD
usr      11922     1  0 15:11 ?        00:00:00 thecommand

मुझे नहीं पता कि इसे पॉज़िक्स में कैसे कहा जाता है या प्रलेखित किया जाता है, लेकिन मैं 1990 से इस तरह का उपयोग bsh, ksh और अब bash में करता हूं।

अन्त में, आप bgबिलिन शेल कमांड का उपयोग कर सकते हैं :

बस अपना प्रोग्राम लॉन्च करें और यदि आप इसे रोकने का निर्णय लेते हैं, या इसे पृष्ठभूमि में रखने की योजना बनाते हैं, तो CTRL + Z टाइप करें:

$ thecommand
^Z
[1] Stopped          thecommand

अब इसे पृष्ठभूमि में चलाना जारी रखें:

$ bg
[1]+ thecommand &

यदि आप प्रक्रिया infos को देखते हैं, तो यह अभी तक एक मूल प्रक्रिया है:

$ ps -f
UID        PID  PPID  C STIME TTY          TIME CMD
usr      12046  2643  0 15:18 pts/6    00:00:00 bash
usr      12571 12046  0 16:00 pts/6    00:00:00 thecommand
usr      12601 12046  0 16:04 pts/6    00:00:00 ps -f

इसलिए, वर्तमान प्रक्रिया से बाहर निकलें। पृष्ठभूमि में चल रही प्रक्रिया अपने मूल माता-पिता से अलग है और पृष्ठभूमि में चलती रहती है:

$ exit

फिर से लॉगिन करें और प्रक्रिया की जानकारी देखें:

$ ps -f 12571
UID        PID  PPID  C STIME TTY          TIME CMD
usr      12571     1  0 16:00 ?        00:00:00 thecommand
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.