क्या मैं पहले से शुरू की गई प्रक्रिया को नोह / स्क्रीन कर सकता हूं?


260

मैं SSH पर लंबे समय से चल रहे डेटा माइग्रेशन स्क्रिप्ट्स के कुछ टेस्ट-रन कर रहा हूं। मान लीजिए कि मैं शाम 4 बजे के आसपास स्क्रिप्ट चलाना शुरू करता हूं; अब, 6 बजे के आसपास रोल करता हूं, और मैं यह सब नहीं करने के लिए खुद को कोस रहा हूं screen

क्या किसी nohupप्रक्रिया को "पूर्वव्यापी" करने का कोई तरीका है , या क्या मुझे पूरी रात अपने कंप्यूटर को ऑनलाइन छोड़ने की आवश्यकता है? यदि मैं पहले से ही शुरू की गई एक प्रक्रिया को संलग्न screenकरना संभव नहीं nohupहूं, तो क्यों? माता-पिता / बच्चे की बातचीत के साथ कुछ करना है? (मैं "नहीं" उत्तर स्वीकार नहीं करूंगा जो कम से कम 'क्यों' के प्रश्न को संबोधित नहीं करता है - क्षमा करें;)


4
बस के बारे में एक दिलचस्प ब्लॉग पोस्ट देखा disownblogs.oracle.com/ksplice/entry/disown_zombie_children_and_the
ojrac

जवाबों:


212

यदि आप बैश का उपयोग कर रहे हैं, तो आप चला सकते हैं disown -h job

अस्वीकार करना

disown [-ar] [-h] [jobspec ...]

विकल्पों के बिना, प्रत्येक कार्यक्षेत्र को सक्रिय नौकरियों की तालिका से हटा दिया जाता है। यदि -hविकल्प दिया जाता है, तो नौकरी को तालिका से नहीं हटाया जाता है, लेकिन इसे चिह्नित किया जाता है, ताकि शेल को एक SIGHUP प्राप्त होने पर नौकरी पर नहीं भेजा जाए। यदि jobspec मौजूद नहीं है, और न तो -aहै और न ही -rविकल्प आपूर्ति की है, मौजूदा नौकरी प्रयोग किया जाता है। यदि कोई जॉबस्पेक आपूर्ति नहीं करता है, तो -a विकल्प का मतलब सभी नौकरियों को निकालना या चिह्नित करना है; -rएक jobspec तर्क के बिना विकल्प नौकरियों चलाने के लिए संचालन प्रतिबंधित करता है।


बहुत बढ़िया; मैं उम्मीद कर रहा था कि ऐसा कुछ होगा।
ओज्र्क

7
जीवन अनुचित हो सकता है। घाटपर और मैं एक ही समय में यह पोस्ट कर रहे थे :)
सर्वरहोर

4
आप मेरे हीरो हैं
थॉमस डिगन

9
डिस्क्स को कोसना विशिष्ट नहीं है। यह zsh, ksh93, में भी है ...
फिल पी

2
मैंने पाया कि आपको वास्तव में उपयोग करना है disown %1अगर 1 जॉबस्पेक है, तो fg या bg के विपरीत, जहां आप सिर्फ bg 1 serverwatch.com/tutorials/article.php/3935306/… का
mltsy

81

रेप्टियर का उपयोग करें

README से:

reptyr - A tool for "re-ptying" programs.
-----------------------------------------

reptyr is a utility for taking an existing running program and
attaching it to a new terminal. Started a long-running process over
ssh, but have to leave and don't want to interrupt it? Just start a
screen, use reptyr to grab it, and then kill the ssh session and head
on home.

USAGE
-----

  reptyr PID

"reptyr PID" will grab the process with id PID and attach it to your
current terminal.

After attaching, the process will take input from and write output to
the new terminal, including ^C and ^Z. (Unfortunately, if you
background it, you will still have to run "bg" or "fg" in the old
terminal. This is likely impossible to fix in a reasonable way without
patching your shell.)

इसके लेखक द्वारा कुछ ब्लॉग पोस्ट:


मैं बिल्ट-इन टूल्स (यानी डिसाइड) के साथ छड़ी करने जा रहा हूं, लेकिन यह रेप्टियर की तरह लचीला नहीं है। +1
ओजार्क

22

अपने वर्तमान tty में एक tty से एक प्रक्रिया चुराने के लिए, आप इस हैक को आज़माना चाहते हैं:

http://www.ucc.asn.au/~dagobah/things/grab.c

वर्तमान Linux / glibc संस्करणों को संकलित करने के लिए इसमें कुछ सुधार की आवश्यकता है, लेकिन फिर भी यह काम करता है।


1
असाधारण रूप से शांत।
ओजार्क

16

जब कोई प्रक्रिया शुरू होती है, तो STDIN, STDOUT और STDERR किसी चीज़ से जुड़े होते हैं । आम तौर पर आप यह नहीं बदल सकते हैं कि एक बार कमांड शुरू हो जाए। आप जिस मामले का वर्णन कर रहे हैं, वह संभवतः ssh सत्र से जुड़ा हुआ है। नोहुप बहुत ज्यादा बस ...

command < /dev/null > nohup.out 2>&1

यही है, STDIN को / dev / null, STDOUT को एक फाइल और STDERR को STDOUT में सेट करता है। स्क्रीन बहुत अधिक परिष्कृत चीजें करता है जिसमें ट्टी सेट करना शामिल है जो स्वयं को निर्देशित करता है।

मैं किसी भी तरह से पीछे हटने या चलने की प्रक्रिया की जांच करने का कोई तरीका नहीं जानता। यदि आप / खरीद / $ pid / fd करने के लिए cd और देखते हैं कि 0, 1 और 2 क्या इंगित करता है।

हो सकता है कि आपके पास कुछ गड़बड़ हो, लेकिन अगर प्रक्रिया STDIN, STDOUT या STDERR के साथ कुछ करने की कोशिश नहीं करती है।


2
अच्छी टिप्पणियों के लिए +1। सेंट (डाइन | आउट | इरेल) समस्या का दूसरा आधा हिस्सा है, और मैं इस सलाह की सराहना करता हूं कि कहां शुरू करना है, अगली बार मैं इस जाम में हूं।
ओज्र्क

6
आप वास्तव में इसे अधिकांश यूनिक्स पर बदल सकते हैं। यह एक घृणित हैक है। मुझे यह पसंद है। :) आप क्या कर रहे हैं, ptrace की तरह डिबग सपोर्ट का उपयोग करके प्रक्रिया से कनेक्ट करें, फिर प्रक्रिया को दुसरे फ़ाइलहैंड में 0,1,2 को फिर से जोड़ने के लिए dup2 () को कॉल करने के लिए बाध्य करें।
ज़ैन लिंक्स

2
हाँ, आप इसे बदल सकते हैं। प्रक्रिया (SIGSTOP) को रोकने, और fd 0, 1, 2 के लिए फ़ाइल डिस्क्रिप्टर को संशोधित करना। फिर (SIGCONT) को पुनरारंभ करना।
माइकल मार्टिनेज

13

क्रायोपिड , Grab.c के लेखक का एक और विकास है जो एक प्रक्रिया को एक फ़ाइल में जमा करता है, जिसे आप प्रक्रिया को फिर से शुरू करने के लिए (स्क्रीन के अंदर) चलाते हैं।


1
अच्छा! मैंने अपने माइग्रेशन के बारे में प्रोसेस माइग्रेशन में क्रायोपिड का उपयोग करने की कोशिश की, लेकिन यह हर समय काम करने में विफल रहा, चाहे मैंने कुछ भी किया हो। अंत में, मुझे लिनक्स के एक प्राचीन संस्करण के साथ dynckpt का उपयोग करना था। क्या आप शायद क्रायोपिड के विकास में शामिल हैं? मैं देखता हूं कि आपका नाम लेखक के डोमेन के समान है।
जूलियानो

1
मैं विकास में शामिल नहीं हूं, मैं सिर्फ विश्वविद्यालय से लेखक को जानता हूं। उस वक्त वह इस समय cryopid रखना आवश्यक नहीं करता, इसलिए ऐसा लगता है कि कुछ लोगों को कम से उस पर काम करना शुरू किया sharesource.org/project/cryopid
टीआरएस -80

12

मैं आपको केवल स्क्रीन भाग के लिए बिना एक सरल "नहीं" दे सकता हूं, मैं स्वयं इस कारण में आपकी दिलचस्पी होगी।

हालाँकि आपने कोशिश की है disown(एक बाश बिलिन)

~ $ echo $SHELL
/bin/bash
~ $ type disown
disown is a shell builtin
~ $ help disown
disown: disown [-h] [-ar] [jobspec ...]
     By default, removes each JOBSPEC argument from the table of active jobs.
    If the -h option is given, the job is not removed from the table, but is
    marked so that SIGHUP is not sent to the job if the shell receives a
    SIGHUP.  The -a option, when JOBSPEC is not supplied, means to remove all
    jobs from the job table; the -r option means to remove only running jobs.


5

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

हालाँकि मैंने इसका उपयोग नहीं किया है, इसलिए मैं इस पर टिप्पणी नहीं कर सकता कि यह काम करता है या नहीं।


2

मैं शायद यह सोच रहा हूं कि यह मुझे ठीक करने के लिए स्वतंत्र है (मैं पहले से ही अव्यवस्थित के बारे में जान चुका हूं!) ... क्या पृष्ठभूमि में चलने वाली प्रक्रिया को कम से कम प्राप्त करने के लिए ctrl-Z और "bg" काम नहीं होगा? या यह महत्वपूर्ण मुद्दा है कि आप अभी भी STDOUT देखना चाहते हैं जबकि यह चलता है?


1
यह तब भी प्रक्रिया को मार डालेगा जब मालिक टटी मर जाता है, तो ओपी को उस बॉक्स को छोड़ने की जरूरत होती है, जहां उसने कमांड चलाने की सूचना दी हो, जिससे वह बचना चाहता है
सर्वर

ठीक है मैं खरीद लूंगा। स्पष्टीकरण के लिए धन्यवाद। अतः मेरे सुझाव से निश्चित रूप से बहुत अधिक होशियार दिखते हैं :-)
क्रिस_के

1
आप अभी भी ऐसा कर सकते हैं, ठीक होने के बाद आपको -h: stackoverflow.com/a/625436/705198
एंड्रयूपेक

2

यदि आप इस प्रक्रिया के साथ बातचीत नहीं कर पा रहे हैं और आप रैंडम कर्नेल मॉड्यूल को लोड करने में आपत्ति नहीं करते हैं, तो आप स्नूप को देखने की तुलना में बदतर कर सकते हैं । वैकल्पिक रूप से, कुछ अन्य परियोजनाएं हैं। यहाँ एक कॉल चोट है, जो ज्यादातर आप क्या करना चाहते हैं कर सकते हैं।


2

आप आउटपुट आउटपुट को gdb के साथ फाइल करने के लिए रीडायरेक्ट कर सकते हैं

https://blog-en.openalfa.com/how-to-detach-from-the-terminal-a-running-process-in-linux

और फिर इसे डिसाइड कर दिया

अपडेट: मुझे sudo के साथ gdb चलाना था और Ubuntu 18.04 में थोड़ा अलग gdb कमांड देना था:

p (int)dup2(open("/tmp/test.stdout", 1), 1)


GDB का शानदार उपयोग, धन्यवाद!
ojrac

1

मैं कमांड लाइन ब्राउज़र nohupको शुरू करने के लिए (या समान) का उपयोग करना चाहता था linksऔर एएसपी.नेट वेबसाइट से जटिल प्रमाणीकरण प्रक्रिया और बहुत सारे छिपे हुए दृश्य स्थिति से फ़ाइल डाउनलोड करने के बाद इसे संलग्न करना चाहता था जिससे काम करना मुश्किल हो गया के साथ curl/ wget

मैंने आखिरकार काम खत्म कर लिया, tmuxजिससे काम बहुत अच्छा हो गया:

  1. Daud tmux
  2. अपना ऐप चलाएं ( linksमेरे मामले में) और इसे चलाना छोड़ दें
  3. SSH सत्र बंद करें, ऐप चालू रहेगा
  4. बाद में उसी मशीन से SSH से कनेक्ट करें और tmux attachऐप को स्क्रीन पर वापस लाने के लिए चलाएं

tmux महान है - लेकिन, nohup या स्क्रीन की तरह, यह केवल तभी काम करता है जब आप अपनी प्रक्रिया शुरू करने से पहले इसका उपयोग करते हैं। यह प्रश्न उस समय के बारे में है जब आपको एहसास होता है कि आपकी प्रक्रिया पहले से ही चल रही है।
१६

-1

क्या यह है कि आप सत्र के समय के बारे में चिंतित हैं? उस स्थिति में आप Ctrl-z और bg प्रक्रिया कर सकते हैं, और फिर सत्र को "पिंग-टी लोकलहोस्ट" या "टॉप" की तरह जीवित रखने के लिए कुछ सोच सकते हैं।

यदि यह है कि आप लॉगआउट करना चाहते हैं, तो मुझे डर है कि मैं अन्य टिप्पणियों में जोड़ नहीं सकता।


यह लॉगआउट की बात है।
ojrac

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