सवाल टर्मिनल से पूरी तरह से प्रक्रिया को कैसे अलग कर सकता हूं?


मैं उबंटू पर टिल्ड (ड्रॉप-डाउन टर्मिनल) का उपयोग अपने "कमांड सेंट्रल" के रूप में करता हूं - जो लोग अन्य लोग गनोम डू, क्विक्सिलवर या लॉन्ची का उपयोग कर सकते हैं।

हालांकि, मैं टर्मिनल से एक प्रक्रिया (जैसे फ़ायरफ़ॉक्स) को पूरी तरह से अलग करने के तरीके से संघर्ष कर रहा हूं - यानी इस तरह की (गैर-) बाल प्रक्रिया को रोकें

  • मूल टर्मिनल को बंद करते समय समाप्त कर दिया जाता है
  • STDOUT / STDERR के माध्यम से मूल टर्मिनल "प्रदूषण"

उदाहरण के लिए, "उचित" टर्मिनल विंडो में विम शुरू करने के लिए, मैंने निम्न की तरह एक साधारण स्क्रिप्ट की कोशिश की है:

exec gnome-terminal -e "vim $@" &> /dev/null &

हालांकि, यह अभी भी प्रदूषण का कारण बनता है (साथ ही, फ़ाइल नाम पास करने से काम नहीं लगता है)।


278
2018-03-23 11:59


मूल


वह भी एक अच्छा सवाल है। मुझे लगता है कि बैश को एक प्रोग्रामिंग भाषा पर विचार करना उचित है - हालांकि वास्तव में इस प्रश्न का दायरा शायद sysadmin पक्ष पर अधिक है ...
यह इस सवाल का एक डुप्लिकेट है stackoverflow.com/questions/285015/... - Dana the Sane
की नकल:superuser.com/questions/177218/... - behrooz
आपका उपयोग केस पूर्ण पृथक्करण का वर्णन नहीं करता है, प्रति से। - jiggunjer


जवाब:


सबसे पहले; एक बार प्रक्रिया शुरू करने के बाद, आप इसे पहले रोककर पृष्ठभूमि कर सकते हैं (हिट Ctrl-जेड) और फिर टाइपिंग bg इसे पृष्ठभूमि में फिर से शुरू करने के लिए। अब यह एक "नौकरी" है, और इसकी stdout/stderr/stdin अभी भी आपके टर्मिनल से जुड़े हुए हैं।

आप इसे "एंड" को अंत में जोड़कर तुरंत पृष्ठभूमि के रूप में एक प्रक्रिया शुरू कर सकते हैं:

firefox &

पृष्ठभूमि में इसे चलाने के लिए चुपचाप, इसका उपयोग करें:

firefox </dev/null &>/dev/null &

कुछ अतिरिक्त जानकारी:

nohup एक प्रोग्राम है जिसका आप उपयोग कर सकते हैं के साथ अपना आवेदन चलाने के लिए जैसे कि इसके stdout / stderr को इसके बजाय फ़ाइल में भेजा जा सकता है और जैसे कि मूल स्क्रिप्ट को बंद करना बच्चे को SIGHUP नहीं करेगा। हालांकि, आवेदन शुरू करने से पहले आपको दूरदर्शिता का उपयोग करने की ज़रूरत है। रास्ते की वजह से nohup काम करता है, आप बस नहीं कर सकते हैं इसे एक चल रही प्रक्रिया पर लागू करें

disown एक बैश बिल्टिन है जो शैल की जॉब सूची से खोल नौकरी हटा देता है। इसका मूल अर्थ यह है कि आप इसका उपयोग नहीं कर सकते हैं fg, bg अब और अधिक महत्वपूर्ण बात यह है कि जब आप अपना खोल बंद करते हैं तो यह लटका नहीं होगा या नहीं भेजेगा SIGHUP उस बच्चे को अब और। भिन्न nohup, disown प्रयोग किया जाता है बाद प्रक्रिया लॉन्च और पृष्ठभूमि की गई है।

क्या तुमको नहीं कर सकते हैं करते हैं, इसे लॉन्च करने के बाद प्रक्रिया के stdout / stderr / stdin को बदलते हैं। कम से कम खोल से नहीं। यदि आप अपनी प्रक्रिया लॉन्च करते हैं और उसे बताते हैं कि इसका स्टडआउट आपका टर्मिनल है (जो आप डिफ़ॉल्ट रूप से करते हैं), तो उस प्रक्रिया को आपके टर्मिनल पर आउटपुट करने के लिए कॉन्फ़िगर किया गया है। आपके खोल में प्रक्रियाओं के साथ कोई व्यवसाय नहीं है 'एफडी सेटअप, यह पूरी तरह से प्रक्रिया है जो प्रक्रिया स्वयं ही प्रबंधित होती है। प्रक्रिया स्वयं ही तय कर सकती है कि अपने stdout / stderr / stdin को बंद करना है या नहीं, लेकिन आप ऐसा करने के लिए मजबूर करने के लिए अपने खोल का उपयोग नहीं कर सकते हैं।

पृष्ठभूमि प्रक्रिया 'आउटपुट का प्रबंधन करने के लिए, आपके पास स्क्रिप्ट से बहुत सारे विकल्प हैं, "नोहुप" शायद दिमाग में आने वाले पहले व्यक्ति हैं। लेकिन इंटरैक्टिव प्रक्रियाओं के लिए आप शुरू करते हैं लेकिन चुप्पी भूल जाते हैं (firefox < /dev/null &>/dev/null &) आप वास्तव में बहुत कुछ नहीं कर सकते हैं।

मैं आपको जीएनयू प्राप्त करने की सलाह देता हूं screen। स्क्रीन के साथ आप अपने रनिंग खोल को बंद कर सकते हैं जब प्रक्रिया 'आउटपुट परेशान हो जाता है और एक नया खोलता है (^Ac)।


ओह, और वैसे, "$@"जहां आप इसका उपयोग कर रहे हैं।

$@माध्यम, $1, $2, $3 ..., जो आपके आदेश को चालू कर देगा:

gnome-terminal -e "vim $1" "$2" "$3" ...

शायद यह नहीं है कि आप क्या चाहते हैं क्योंकि-केवल लेता है एक तर्क। उपयोग $1 यह दिखाने के लिए कि आपकी स्क्रिप्ट केवल एक तर्क को संभाल सकती है।

आपके द्वारा दिए गए परिदृश्य में ठीक से काम कर रहे कई तर्क प्राप्त करना वाकई मुश्किल है (के साथ gnome-terminal -e) इसलिये -e केवल एक तर्क लेता है, जो एक शेल कमांड स्ट्रिंग है। आपको अपने तर्कों को एक में एन्कोड करना होगा। सबसे अच्छा और सबसे मजबूत, बल्कि बदसूरत, रास्ता इस तरह है:

gnome-terminal -e "vim $(printf "%q " "$@")"

313
2018-03-23 13:18



इसके लिए बहुत - बहुत धन्यवाद! दुख की बात है कि मैं केवल एक जवाब स्वीकार कर सकता हूं। मैं "नोहप $ @ और> / dev / null" और "alias wvim = 'launch.sh gnome-terminal -x vim' के साथ समाप्त हुआ
क्या एक शानदार रूप से विस्तृत और सूचनात्मक उत्तर है। +1 - Teekin
@ हाय-एंजेल जब आप एक इंटरेक्टिव बैश खोल बंद करते हैं, तो सभी सक्रिय नौकरियों को HUPs दबाएं। जब आप ^ जेड और बीजी एक प्रक्रिया है, यह अभी भी एक नौकरी है, यह पृष्ठभूमि एक हो। इसे नौकरी के रूप में हटाने के लिए, उपयोग करें disown, तब आप खोल को बंद करने के बाद प्रक्रिया को जारी रखेंगे क्योंकि बैश अब इसे नहीं करेगा। - lhunath
उपयोग नहीं करेंगे $* के बजाय $@ पहले से अलग तारों की समस्या को ठीक करें? - sjas
आप क्या नहीं कर सकते हैं, इसे लॉन्च करने के बाद प्रक्रिया के stdout / stderr / stdin को बदलना है। बिल्कुल सही नहीं है। उपयोग reptyr इसके लिए। - Stefan Seidel


nohup cmd &

nohup पूरी तरह से प्रक्रिया को अलग करता है (इसे डिमन करता है)


193
2018-03-23 12:17



हालांकि संक्षेप मूल्यवान है, पूर्णता अधिक मूल्यवान है। यद्यपि नोहुप एक जीएनयू कोरुटिल है, लेकिन केवल एक ही जवाब (या वहां एक के बारे में नोट नहीं है) यहां उचित होगा। फिर भी अच्छा जवाब। - Limited Atonement
nohup बस अनदेखा करता है SIGHUP संकेत। यह सामान्य रूप से प्रक्रिया निष्पादित करता है। कोई डिमनीकरण नहीं। - nemo
@ नीमो जिसका अर्थ है कि प्रक्रिया अलग नहीं है, लेकिन अलग हो जाएगी (और एक बच्चा init) अगर खोल निकल गया ... सही? - Noldorin
@ नोल्डोरिन हां। SIGHUP को अनदेखा करना, जिसे खोल समाप्त होने पर भेजा जाता है, बच्चे की प्रक्रिया को चलने और इनिट में स्थानांतरित होने से रोक देगा। - nemo
@ निमो नोहप मानक / आउट मानक भी चुप है। पूरी तरह से अलग करने के लिए अस्वीकार के साथ पालन करें। - jiggunjer


यदि आप उपयोग कर रहे हैं bash, प्रयत्न disown [jobspec]; देख बैश (1)

एक और दृष्टिकोण आप कोशिश कर सकते हैं at now। यदि आप सुपरसियर नहीं हैं, तो उपयोग करने की आपकी अनुमति at प्रतिबंधित हो सकता है।


53
2018-03-23 12:05



"अस्वीकार" एक आंतरिक बैश कमांड प्रतीत नहीं होता है (मेरी मशीन पर उपलब्ध नहीं है, और मैं बैश का उपयोग करता हूं)। बेन ने सुझाव दिया, "नोहुप", ऐसा करने का एक बेहतर (और मानक) तरीका हो सकता है।
कभी भी "एट" का उपयोग करने के बारे में सोचा नहीं, विचार के लिए धन्यवाद! - cadrian
at किसी और को निष्पादन का प्रतिनिधित्व करने के लिए, मुझे यह पसंद है! +1 - Ninsuo
संदर्भ के एक बिंदु के रूप में, यह काम करता है zsh भी। - Coderer
इसके अलावा, disown ऐसा वांछित प्रभाव प्रतीत नहीं होता है gnome-terminal-disownजब टर्मिनल निकलता है तो एड प्रक्रियाएं अभी भी मारे जाती हैं। मुझे यह जानना अच्छा लगेगा कि कैसे / कैसे। - Kyle Strand


इन उत्तरों को पढ़ना, मैं जारी करने वाली प्रारंभिक छाप के तहत था nohup <command> & पर्याप्त होगा Gnome टर्मिनल में zsh चल रहा है, मैंने पाया nohup <command> & बाहर निकलने पर बाल प्रक्रियाओं को मारने से मेरे खोल को रोका नहीं। हालांकि nohup उपयोगी है, खासकर गैर-इंटरैक्टिव शैल के साथ, यह केवल इस व्यवहार की गारंटी देता है अगर बाल प्रक्रिया अपने हैंडलर को रीसेट नहीं करती है SIGHUP संकेत।

मेरे मामले में, nohup आवेदन तक पहुंचने से हैंगअप सिग्नल को रोकना चाहिए था, लेकिन बच्चे के आवेदन (इस मामले में वीएमवेयर प्लेयर) इसे रीसेट कर रहा था SIGHUP हैंडलर। नतीजतन जब टर्मिनल एमुलेटर निकलता है, तब भी यह आपके उपप्रोसेस को मार सकता है। यह केवल यह सुनिश्चित करके, कि शैल की नौकरियों की तालिका से प्रक्रिया हटा दी गई है, मेरे ज्ञान के लिए हल किया जा सकता है। अगर nohup एक शेल बिल्टिन के साथ ओवरराइड किया गया है, जैसा कभी-कभी मामला होता है, यह पर्याप्त हो सकता है, हालांकि, अगर यह नहीं है ...


disown एक खोल बनाया गया है bash, zsh, तथा ksh93,

<command> &
disown

या

<command> &; disown

यदि आप एक लाइनर पसंद करते हैं। नौकरियों की तालिका से उपप्रोसे को हटाने का यह आमतौर पर वांछनीय प्रभाव पड़ता है। यह आपको गलती से बाल प्रक्रिया को संकेत दिए बिना टर्मिनल एमुलेटर से बाहर निकलने की अनुमति देता है। कोई फर्क नहीं पड़ता कि क्या SIGHUP हैंडलर दिखता है, यह आपके बच्चे की प्रक्रिया को मारना नहीं चाहिए।

अस्वीकार करने के बाद, प्रक्रिया अभी भी आपके टर्मिनल एमुलेटर का बच्चा है (साथ खेलें pstree यदि आप इसे क्रिया में देखना चाहते हैं), लेकिन टर्मिनल एमुलेटर निकलने के बाद, आपको इसे init प्रक्रिया से जुड़ा देखना चाहिए। दूसरे शब्दों में, सब कुछ वैसा ही होना चाहिए, और जैसा कि आप संभवतः यह होना चाहते हैं।

यदि आपका खोल समर्थन नहीं करता है तो क्या करें disown? मैं दृढ़ता से उस व्यक्ति को स्विच करने का समर्थन करता हूं जो कि करता है, लेकिन उस विकल्प की अनुपस्थिति में, आपके पास कुछ विकल्प हैं।

  1. screen तथा tmux इस समस्या को हल कर सकते हैं, लेकिन वे बहुत भारी वजन समाधान हैं, और मुझे ऐसे सरल कार्य के लिए चलाने के लिए नापसंद है। वे उन परिस्थितियों के लिए अधिक उपयुक्त हैं जिनमें आप एक टाटी बनाए रखना चाहते हैं, आमतौर पर रिमोट मशीन पर।
  2. कई उपयोगकर्ताओं के लिए, यह देखने के लिए वांछनीय हो सकता है कि आपका खोल zsh की तरह एक क्षमता का समर्थन करता है या नहीं setopt nohup। इसका उपयोग निर्दिष्ट करने के लिए किया जा सकता है SIGHUPजब खोल निकलती है तो नौकरियों की मेज में नौकरियों को नहीं भेजा जाना चाहिए। आप या तो खोल से बाहर निकलने से पहले इसे लागू कर सकते हैं, या इसे खोल कॉन्फ़िगरेशन में जोड़ सकते हैं ~/.zshrc यदि आप हमेशा इसे चाहते हैं।
  3. नौकरियों की मेज को संपादित करने का एक तरीका खोजें। मुझे ऐसा करने का कोई तरीका नहीं मिला tcsh या csh, जो कुछ हद तक परेशान है।
  4. कांटा बंद करने के लिए एक छोटा सी प्रोग्राम लिखें और exec()। यह एक बहुत ही खराब समाधान है, लेकिन स्रोत में केवल दो दर्जन लाइनें होनी चाहिए। फिर आप सी प्रोग्राम को कमांडलाइन तर्क के रूप में आदेश पास कर सकते हैं, और इस प्रकार नौकरियों की तालिका में एक प्रक्रिया विशिष्ट प्रविष्टि से बचें।

36
2018-01-22 17:08





  1. नोहप $ कमांड &

  2. $ कमांड और अस्वीकार

  3. सेटिड कमांड

मैं बहुत लंबे समय तक नंबर 2 का उपयोग कर रहा हूं, लेकिन नंबर 3 भी काम करता है। इसके अलावा, अस्वीकार '-h' का 'नोहुप' ध्वज है, '-a' के साथ सभी प्रक्रियाओं को अस्वीकार कर सकता है, और '-ar' के साथ सभी चल रही प्रक्रियाओं को अस्वीकार कर सकता है।

Silencing '$ COMMAND &> / dev / null' द्वारा पूरा किया जाता है।

उम्मीद है की यह मदद करेगा!


24
2017-08-25 14:39





मुझे लगता है कि स्क्रीन आपकी समस्या का समाधान कर सकती है


9
2018-03-25 01:51





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

इसकी तुलना करें:

> jobs # shows nothing
> firefox &
> jobs
[1]  + Running                       firefox

इसके लिए:

> jobs # shows nothing
> (firefox &)
> jobs # still shows nothing
>

यह नौकरियों की सूची से फ़ायरफ़ॉक्स हटा देता है, लेकिन यह अभी भी टर्मिनल से जुड़ा हुआ है; अगर आपने 'ssh' के माध्यम से इस नोड में लॉग इन किया है, तो लॉग आउट करने का प्रयास अभी भी एसएसएच प्रक्रिया को लटकाएगा।


8
2018-03-23 14:55





उदाहरण के लिए उप-खोल के माध्यम से tty shell run कमांड को अलग करने के लिए

(आदेश) और

बाहर निकलने पर टर्मिनल बंद हो गया लेकिन प्रक्रिया अभी भी जिंदा है।

चेक -

(sleep 100) & exit

अन्य टर्मिनल खोलें

ps aux | grep sleep

प्रक्रिया अभी भी जिंदा है।


6
2017-08-07 05:18



मुझे ठीक इसी की आवश्यकता थी। मैं उत्कृष्ट पाठ के लिए एक कंसोल शॉर्टकट जोड़ने का प्रयास कर रहा था और यह पूरी तरह से काम करता है, यहां मैंने जो समाप्त किया है: ("/ opt / sublime text 2 / sublime_text" $ @) & - Ron E


बैश के लिए सबसे सरल और केवल सही उत्तर:

command & disown

आपको टर्मिनल से प्रक्रिया को अलग नहीं करना है, बल्कि खोल से।


6
2018-05-05 11:55





बैकग्राउंडिंग और नौकरी का अग्रभूमि संभवत: पहली यूनिक्स सिस-एडमिन को जानना चाहिए सबसे पहले चीजों में से एक है।

यहां बताया गया है कि यह बैश के साथ कैसे किया जाता है:

./script.sh
# suspend process
{ctrl-Z}
# background process
bg
# list all backgrounded jobs
jobs
# bring it back to foreground
fg

5
2018-05-22 23:00





आप नोहप कमांड का उपयोग करके अपना कमांड चला सकते हैं, यह आपकी प्रक्रिया को अलग करता है और आउटपुट को किसी दिए गए फाइल पर रीडायरेक्ट करता है ... लेकिन मुझे यकीन नहीं है कि आपको वही चाहिए जो आपको चाहिए ..


4
2018-03-23 12:03



मैं कसम खाता हूं कि मैंने निष्पादन का उपयोग करने से पहले नोहप की कोशिश की थी - लेकिन स्पष्ट रूप से ठीक से नहीं, क्योंकि यह इस तरह काम करता है: नोहप gnome-terminal -e "vim $ @" और> / dev / null &