मैं एक चल रही प्रक्रिया को कैसे समाप्त कर सकता हूं और इसे एक नए स्क्रीन शेल में जोड़ सकता हूं?


159

मेरा SSH शेल पर एक रनिंग प्रोग्राम है। मैं इसे रोकना चाहता हूं और जब मैं वापस आता हूं तो इसके निष्पादन को रोकना चाहता हूं।

एक तरह से मैंने ऐसा करने के बारे में सोचा था कि इसके स्वामित्व को एक स्क्रीन शेल में स्थानांतरित करना है, इस प्रकार इसे वहां चालू रखना है।

क्या आगे बढ़ने का एक अलग तरीका है?


8
यह भी देखें क्या मैं पहले से शुरू की गई प्रक्रिया को नोहप / स्क्रीन कर सकता हूँ? और फिर से शुरू SSH सत्र , जो कई ptrace- आधारित समाधानों का उल्लेख नहीं है (वर्तमान में) का उल्लेख कर रहे हैं।
गाइल्स

Unix.stackexchange.com/a/4039/13496 जैसे सवालों से मैं रिट्टी और नेकर के बारे में सुन रहा हूं । हम्म् ... आश्चर्य है कि अगर अगली बार एक प्रक्रिया को चलाने से पहले " स्क्रीन यहाँ" परत की तरह स्मूथ हो, तो मुझे भविष्य में शीर्ष टर्मिनल को खोना चाहिए, इससे स्टड / आउट / इरेट में वापस स्नैप करना आसान हो जाएगा
मार्कोस

इस प्रश्न में द्वितीयक / निहित मुद्दा यह है कि मैं थाह नहीं कर सकता ... शेल ने एक निलंबित नौकरी को भंग करने का विकल्प क्यों चुना जब एक नया / बस एक पृष्ठभूमि में लॉन्च किया गया है जिसे स्टड के लिए भी ज़रूरत नहीं है / प्रतीक्षा करें? यह वह उपचार है जिसका मैंने उपयोग किया है ताकि पता न चले कि यहाँ क्या अलग हुआ ...
मार्कोस

जवाबों:


86

GNU screenका उपयोग करना आपकी सबसे अच्छी शर्त है।

स्क्रीन प्रदर्शित होना आरंभ हो जब आप पहली बार लॉगिन - मैं चलाने के screen -D -Rलिए, अपने आदेश चला, और या तो डिस्कनेक्ट या के साथ निलंबित CTRL-Zऔर फिर दबाकर स्क्रीन से डिस्कनेक्ट CTRL-Aतो D

जब आप मशीन में फिर से लॉगिन करते हैं, तो चलकर फिर से कनेक्ट करें screen -D -R। आप पहले की तरह एक ही खोल में रहेंगे। jobsयदि आपने ऐसा किया है, तो आप निलंबित प्रक्रिया को देखने के लिए दौड़ सकते हैं और %1इसे फिर से अग्रसर करने के लिए (या संबंधित नौकरी #) चला सकते हैं ।


2
वाह, मुझे विश्वास नहीं हो रहा है कि जीएनयू स्क्रीन का एक जवाब वर्तमान में सबसे कम मूल्यांकन किया गया है। क्या मैं कुछ भूल रहा हूँ?
फहीम मीठा

1
शायद! मुझे सबसे अच्छा लगता है।
एंड्रयू योकुम

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

28
मुझे लगता है कि इस सवाल का जवाब नहीं है। सवाल " मैं एक कार्यक्रम चल रहा है " से शुरू होता है । यह उत्तर मानता है कि यह अभी तक नहीं चल रहा है ...
Anko

हाँ उन्होंने स्पष्ट रूप से लिखा है कि वह इसे एक स्क्रीन सत्र में लाना चाहते हैं :-)
फ्लोरियन हेगल

112

आप disownअंतर्निहित शेल के साथ शेल से प्रोग्राम के "स्वामित्व" को रद्द कर सकते हैं :

# press Ctrl+Z to suspend the program
bg
disown

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


डिबगर में प्रोग्राम को अटैच करके एक अलग फाइल पर फाइलस्क्रिप्टर्स को फिर से रिबेट करना संभव है (जैसे कि उपयोग करना ptrace) और इसे कॉल करना open, dupऔर close। ऐसा करने वाले कुछ उपकरण हैं; यह एक कठिन प्रक्रिया है, और कभी-कभी वे इसके बजाय प्रक्रिया को क्रैश कर देंगे। संभावनाओं में शामिल हैं (उत्तर से एकत्र किए गए लिंक मैं कैसे एक चलने वाली प्रक्रिया को भंग कर सकता हूं और इसे एक नए स्क्रीन शेल में जोड़ सकता हूं ? और क्या मैं nohup / स्क्रीन को पहले से शुरू की गई प्रक्रिया? ):


disownनौकरी-नियंत्रण सूची से प्रक्रिया को हटा देता है।
ctrl-alt-delor

3
क्यों नहीं disown -h?
सेस टिम्मरमैन

@CeesTimmerman शेल की जॉब टेबल में काम छोड़ देता है, लेकिन इसका क्या फायदा?
गाइल्स

@ गिल्स: तो आप अभी भी fgया killयह कर सकते हैं , और देखें कि क्या यह अपने आप समाप्त हो जाता है।
पीटर कॉर्ड्स

उल्लिखित उपयोगिताओं प्रक्रियाओं के एक समूह के साथ काम करती हैं (जैसे bzcat a.bz2 | grep text)? मैन फॉर का reptyrकहना है कि यह बच्चों के साथ प्रक्रियाओं को आगे बढ़ाने का समर्थन नहीं करता है।
dma_k

64

टर्मिनलों के बीच एक प्रक्रिया को स्थानांतरित करने के लिए या एक अस्वीकृत को फिर से व्यवस्थित करने के लिए, आप उदाहरण के लिए पुनरावृत्ति का उपयोग कर सकते हैं ।


1
हाँ, यह बचाया, धन्यवाद! मैं लेखक की वेबसाइट को पढ़ता हूं कि यह समान या पुराने टूल से बेहतर कैसे काम करता है। ncurses कार्यक्रमों के लिए।
मार्कोस

4
यह कमाल का है; इसे किसी मित्र के विधेय को सीधे ssh में चलाकर अपना काम खो देना चाहिए और फिर ट्रेन में बैठना चाहिए। "उफ़, स्क्रीन का उपयोग करना भूल गया। फिर से।"
एडम काट्ज

3
+1 यद्यपि स्वीकृत screenउत्तर निश्चित रूप से आदर्श है, यह वास्तव में प्रश्न का उत्तर नहीं देता है, जो विशेष रूप से वर्तमान में चल रही प्रक्रिया को या इस तरह स्थानांतरित करने के लिए एक मार्ग का अनुरोध करता है screen। इस उत्तर को भी देखें: serverfault.com/a/284795
टोक्सिफा

1
पूर्ण जीवंत सेवर। उपयोगकर्ता पुष्टि की प्रतीक्षा में बैठे उपयुक्त डिस्ट-अप को चलाने के लिए मुझे फिर से संलग्न करने की अनुमति दी।
andig

28

मेरा पसंदीदा समाधान उपयोग कर रहा है tmux, आप सत्र को अलग कर सकते हैं, और इसे दूसरे टर्मिनल में फिर से संलग्न कर सकते हैं।

जब आप पिछले सत्र से अलग हो जाते हैं, तो आप टर्मिनल को सुरक्षित रूप से बंद कर सकते हैं; बाद tmux attachमें सत्र में वापस आने के लिए उपयोग करें, भले ही आपने लॉग आउट किया हो।


1
आप अपने सत्र को उर मित्र के साथ साझा कर सकते हैं और कई विंडो और पैन का उपयोग कर सकते हैं और बहुत कुछ! प्यार यह ^ _ ^
इगोर

कृपया उपयोग करने का उदाहरण?
विटाली ज़डनेविच

21

रिट्टी नामक एक छोटी सी उपयोगिता भी है जो आपको दूसरे टर्मिनल पर प्रोग्राम चलाने की सुविधा देती है।


19

मैं इसे नियमित रूप से उपयोग नहीं करता, लेकिन neercs इसका समर्थन करने का दावा करते हैं। यह screenबेहतर फलक प्रबंधन जैसी विविध फैंसी सुविधाओं के साथ एक समान कार्यक्रम है, लेकिन मुख्य बात यह है कि एक प्रक्रिया को एक फलक में आयात करने की क्षमता है


2
दिलचस्प। यह गंदा ( ptrace) खेलता है , लेकिन यह सिर्फ फाइल डिस्क्रिप्टर में हेरफेर नहीं करता है, यह प्रक्रिया की तलाश करता है। यह हड़पने में सक्षम है find /, लेकिन एक इंटरैक्टिव बैश को क्रैश कर गया।
गाइल्स

@Gilles मैं याद नहीं कर सकते कि यह कैसे चला गया जब मैं करने की कोशिश की है, लेकिन यह एक महान प्रतिष्ठा नहीं है, मुझे बताया गया हूँ यह बहुत नियमित रूप से विफल रहता है
माइकल Mrozek

9

यदि आप इसे रोकना चाहते हैं और बाद में पुनः आरंभ करना चाहते हैं, तो आप इसके killसाथ STOPया CONTसिग्नल का उपयोग कर सकते हैं ।

पहले पीआईडी ​​के साथ प्रक्रियाओं का पता लगाएं

$ ps aux

फिर प्रक्रिया में सूचीबद्ध उस पीआईडी ​​को संकेत भेजें

$ kill -STOP <PID>

$ kill -CONT <PID>

9

थॉमसहैबेट्स के "इंज्वॉय" से मुझे ठीक वही चीज़ लगती है जिसकी मुझे ज़रूरत है:

https://github.com/ThomasHabets/injcode

निषेधाज्ञा कार्यक्रम मनमाने ढंग से कोड को चलाने की प्रक्रिया में अंतःक्षिप्त होने की अनुमति देता है, चाहे आप पहले से जानते हों या नहीं और स्क्रीन या टीएमएक्स चला रहे हों

README से:

उदाहरण 1: irssi को एक टर्मिनल से दूसरे पर ले जाएं

शायद इसे एक स्क्रीन में स्थानांतरित करें।

पहले एक टर्मिनल में irssi शुरू करें।

किसी अन्य टर्मिनल में निषेधाज्ञा चलाएँ: $ निषेधाज्ञा-एम रिट्टी

Irssi को अब दूसरे टर्मिनल में स्थानांतरित किया जाना चाहिए, जिसमें एक नया नियंत्रण टर्मिनल भी शामिल है।


1

यह मेरे लिए काम किया:

  1. bg प्रक्रिया
  2. jobs -l प्रक्रिया संख्या ज्ञात करें
  3. tmux शेल विंडो मैनेजर शुरू करें
  4. reptyr -L PROCESSNUMBER

reptyrके -Lकाम करने के लिए इसे पाने के लिए जरूरी हो गया था:

-L Like '-l', but also redirect the child's stdio to the slave.

इस त्रुटि के कारण:

$ reptyr 30622

[-] Unable to open the tty in the child.
Unable to attach to pid 30622: Permission denied

और -L के साथ

$ reptyr -L 30622
Opened a new pty: /dev/pts/4
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.