मैं अपने बच्चों को मारे बिना एक टर्मिनल को कैसे बंद कर सकता हूं (बिना `स्क्रीन` पहले चलाए)?


35

कभी-कभी मैं गनोम-टर्मिनल में एक ऐप चलाता हूं, लेकिन फिर मुझे अचानक गनोम या कुछ और फिर से शुरू करना पड़ता है। मुझे लगता है कि प्रश्न का उत्तर भी उपयोगी है, फिर मैं एसएसएच से डिस्कनेक्ट करना चाहता हूं जहां कुछ घटित हो रहा है।

गनोम का टर्मिनल ट्री इस तरह दिखता है:

gnome-terminal
    bash
        some-boring-process

क्या मैं ' bashसे ' अलग कर सकता हूं gnome-terminal(या some-boring-processबैश से अलग कर सकता हूं और इसके आउटपुट को कहीं पर रीडायरेक्ट कर सकता हूं )? अगर मैं बस मारता हूं gnome-terminal, तो bashइसके सभी उपप्रकारों को मार दिया जाएगा


जवाबों:


48

यदि some-boring-processआपके वर्तमान बैश सत्र में चल रहा है:

  1. इसे ctrl-zआप बैश प्रॉम्प्ट देने के लिए रोकें
  2. इसे पृष्ठभूमि में रखें bg
  3. जॉब नंबर नोट करें, या jobsकमांड का उपयोग करें
  4. इस बैश सत्र से प्रक्रिया को अलग करें disown -h %1(वहां वास्तविक नौकरी संख्या का विकल्प दें)।

यह आउटपुट को पुनर्निर्देशित करने के लिए कुछ भी नहीं करता है - आपको लगता है कि जब आप अपनी उबाऊ प्रक्रिया शुरू करते हैं। [संपादित करें] इसे https://gist.github.com/782263 पर पुनर्निर्देशित करने का एक तरीका प्रतीत होता है

लेकिन गंभीरता से, स्क्रीन में देखें। मेरे पास एक दूरस्थ सर्वर पर गोले हैं जो महीनों से चल रहे हैं।


धन्यवाद। मैंने आपके उत्तर का चयन किया क्योंकि यह केवल एक ही था जो प्रश्न का उत्तर देता है (यह पहले से चल रही प्रक्रिया के बारे में था )। मैं पहले से ही screenकभी-कभी उपयोग कर रहा हूं , हालांकि इसके मुद्दे हैं और मैं इसे अपने जीवन में हर बैश सत्र के लिए उपयोग नहीं करना चाहता हूं
valya

आप इसे प्रत्येक बैश सत्र के लिए उपयोग नहीं करते हैं, लेकिन प्रत्येक दूरस्थ मशीन के लिए जहां आप बहुत समय बिताते हैं।
ग्लेन जैकमैन

मैंने आउटपुट को रीडायरेक्ट करने के बारे में जानकारी जोड़ने की स्वतंत्रता ली, कृपया इसकी समीक्षा करें!
वल्या

[जड़ @ सर्वर ~] # bg -bash: bg: वर्तमान: कोई ऐसी नौकरी
मुहम्मद dyas Yaskur

मुझे क्यों मिली bash: bg: current: no such job?
मुहम्मद व्यास यास्कूर

10

यह वही है जो स्क्रीन और tmux के लिए बनाया गया था। आप स्क्रीन / tmux सत्र के अंदर शेल चलाते हैं, और आप वसीयत में डिस्कनेक्ट / फिर से कनेक्ट कर सकते हैं। आपके पास एक गनोम-टर्मिनल के अंदर कई शेल सत्र चल सकते हैं।


धन्यवाद, लेकिन, जैसा कि मैंने स्वीकार किए गए उत्तर पर टिप्पणी की: 1. सवाल पहले से ही चल रही प्रक्रिया के बारे में था। 2. screenइसके मुद्दे हैं और मैं इसे अपने जीवन में हर बैश सत्र के लिए उपयोग करने का मन नहीं करता हूं
Valya

6

screen, tmuxया dtach(संभवतः के साथ dvtm) इसके लिए सभी महान हैं, लेकिन अगर यह ऐसा कुछ है जहां आपने उन में से एक का उपयोग करने के लिए नहीं सोचा था, तो आप लाभ उठाने में सक्षम हो सकते हैं nohup


धन्यवाद, लेकिन, जैसा कि मैंने स्वीकार किए गए उत्तर पर टिप्पणी की: 1. सवाल पहले से ही चल रही प्रक्रिया के बारे में था। 2. screenइसके मुद्दे हैं और मैं इसे अपने जीवन में हर बैश सत्र के लिए उपयोग करने का अनुभव नहीं करता हूं
वेल

@ स्वाल्या ग्लैड आपको एक समाधान मिला। हालांकि, स्पष्ट होना, विकल्प nohupका उपयोग करके -p(यदि उपलब्ध हो) चल रही प्रक्रिया पर काम करता है ।
हांक गे

@ हंक गे: मैं मैन पेजों में एक -pविकल्प नहीं देख सकता nohup; आप किस सिस्टम पर हैं?
मिकेल

@ मायिक इससे पहले कि मैंने चिंता करना और प्यार करना छोड़ दिया tmux, मैंने -pसोलारिस बॉक्स पर विकल्प का उपयोग किया । मेरे पास इसे mongrel CentOS बॉक्स पर करने की अस्पष्ट यादें हैं (संभवत: zshइसमें एक बिल्डिन है जो इसका समर्थन करता है?), लेकिन मुझे उस पर कोई डॉक्स नहीं मिल सकता है।
हांक गे

@Hank समलैंगिक: न तो bashहै और न ही zshमेरी Ubuntu Linux सिस्टम पर प्रदान करते हैं nohup
मिकेल

4

यदि आप केवल इसे पृष्ठभूमि में रखने और इसे जारी रखने के बजाय बच्चे की प्रक्रिया के साथ बातचीत करते रहना चाहते हैं, तो वास्तव में एक कार्यक्रम है जिसे रिट्टी कहा जाता है, जो कि अपने वर्तमान ट्टी से एक प्रक्रिया को "चोरी" करने और इसे फिर से शुरू करने के लिए एक सबूत है। वर्तमान वाला।

हालाँकि, यह कुछ भयानक चीजें करता है, जिसमें कुछ असेंबली कोड को री-अटैच्ड एप्लिकेशन के ढेर पर चिपकाना भी शामिल है। और उस कोड को x86_64 के लिए अपडेट नहीं किया गया है।

एक और कार्यक्रम है जो एक बेहतर-बेहतर दृष्टिकोण लेता है, एक फाइल के लिए उपयोगकर्ता-स्थान में प्रक्रिया को ठंड कर देता है, जिससे इसे बाद में बहाल किया जा सकता है (संभवतः दूसरे ट्टी पर ।) यह क्रायोपिड है , और यह परियोजना भी बंद हो गई लगती है। प्रूफ-ऑफ-कॉन्सेप्ट चरण, और कोड के खड़े होते ही आधुनिक लिनक्स के साथ काम नहीं करता है। ठीक है।

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


1
यह मुझे gist.github.com/782263 की याद दिलाता है ... ओह, यह सवाल मेरे सवाल का जवाब भी लगता है,
Valya

2

अगर मैं किसी ऐसी चीज को आग लगाता हूं जिसे मैं खत्म करना चाहता हूं तो कोई बात नहीं है (सिस्टम रिबूट की कमी), मैं इसका उपयोग करता हूं nohupऔर इसे पृष्ठभूमि में चलाता हूं । स्क्रीन के विपरीत और इस तरह आप प्रक्रियाओं को रिटेट नहीं कर सकते। हालाँकि, किसी अन्य आउटपुट को बार-बार रीडायरेक्ट करने से कोई भी आउटपुट मिल सकता है nohup.out

screenजब मैं किसी प्रक्रिया के लिए टर्मिनलों को स्विच करने में सक्षम होना चाहता हूं तो मैं इसका उपयोग करता हूं। जैसे कि घर / काम से एक प्रक्रिया शुरू करना और दूसरे पर स्विच करना। किसी भी अन्य टर्मिनल सत्र आउटपुट की तरह बफर के शीर्ष पर अंतिम स्क्रॉल होगा।

EDIT: यदि आपने पहले ही प्रक्रिया शुरू कर दी है, तो आप प्रक्रिया बंद होने पर सिग्नल को भेजे जाने से disownरोकने के HUPलिए प्रक्रिया कर सकते हैं।


धन्यवाद, लेकिन, जैसा कि मैंने स्वीकार किए गए उत्तर पर टिप्पणी की: 1. सवाल पहले से ही चल रही प्रक्रिया के बारे में था। 2. screenइसके मुद्दे हैं और मैं इसे अपने जीवन में हर बैश सत्र के लिए उपयोग करने का मन नहीं करता हूं
valya

@valya मैंने कार्यक्रम समूह से एक चल रही प्रक्रिया को डिस्कनेक्ट करने के संदर्भ देखें हैं। मैं ऐसा करने के लिए किसी भी उपकरण का पता नहीं है। इस उपकरण की आवश्यकता होगी कि std IO चैनलों को भी पुनर्निर्देशित किया जाए। मुझे लगता है कि मुझे एक बार काम करने के लिए मिल गया होगा, लेकिन यह तय किया गया कि नोक सरल था।
बिलथोर

1

टर्मिनल सत्र समाप्त होने पर आप एक प्रक्रिया (PID) HUP संकेत प्राप्त नहीं कर सकते। निम्नलिखित आदेश का उपयोग करें:

nohup -p PID

nohup: invalid option -- 'p'। के किन संस्करणों का nohupआप सिस्टम की किस तरह पर चल रहे हैं?
एंथन

मैं ज्यादातर सोलारिस और AIX का उपयोग करता हूं। लिनक्स के लिए, आपको डिस्कनेक्ट कमांड में जांच करनी चाहिए।
टॉनी

हाँ, -pलिनक्स पर कोई विकल्प नहीं है , इसलिए यह उत्तर सोलारिस और AIX विशिष्ट है। हालांकि यह जानना अच्छा है
सर्जियो कोलोडियाज़नी

1

यह स्क्रिप्ट माता-पिता से बाल प्रक्रिया का पता लगाती है और इसे init प्रक्रिया में असाइन करती है :

toDetach=$1

./$toDetach & # Runs the process - script on background

disown -h %$(jobs -l | grep $(ps -A | grep $toDetach | cut --delimiter=' ' -f1) | cut --delimiter=' ' -f1 | tr -d '[]+') # and then disowns it from parents process
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.