टर्मिनल के माध्यम से GUI ऐप को कैसे साफ़ करें?


78

कुछ GUI ऐप टर्मिनल कमांड लाइन के माध्यम से सफाई से लॉन्च होते हैं, लेकिन कुछ नहीं करते हैं, और वे टर्मिनल को एप्लिकेशन को समाप्त करने के लिए इंतजार करने का कारण बनाते हैं। फिर भी, कुछ कमांड लाइन को "रिलीज़" नहीं करते हैं।

रहस्यमय एम्परसैंड &प्रत्यय प्रक्रिया को पृष्ठभूमि में डालने के लिए टर्मिनल का कारण बनता है (लेकिन मुझे यकीन नहीं है कि वहां क्या होता है)।

क्या टर्मिनल के माध्यम से एक ऐप लॉन्च करने का एक तरीका है ताकि कोई "हैंग ऑन" प्रभाव न हो, जैसे कुछ Alt+ के माध्यम से लॉन्च करना F2?

मैं कमांड लाइन फिर से तुरंत उपलब्ध होना चाहता हूं, बिना कुछ भी पृष्ठभूमि में और टर्मिनल में मुद्रण के बिना।


Htorque के अनुरोध पर, मैंने उसका उत्तर हटा दिया जिसे आपने स्वीकार किया था। कृपया आप एक और जवाब ले सकता है (यदि आप htorque की पहली चयन रद्द करना होगा - लाल रंग में पृष्ठ के तल पर गुप्त किया जाना चाहिए)
ओली

1
प्रोग्राम-पहले से चल रहे (जैसे कि con-f-use द्वारा उल्लिखित) से निपटने का तरीका उस स्थिति के लिए अच्छा है, लेकिन जैसा कि मेरा प्राथमिक सवाल बिना किसी टर्मिनल अव्यवस्था के क्लीन-लॉन्चिंग के बारे में था , मैंने स्वीकार कर लिया है screen(ओली द्वारा उल्लिखित) और रॉबिनज)। मैं इसकी क्षमता से प्रभावित हूं; इसके बारे में पढ़ने और इसे आज़माने के बाद ... इसे केवल टाइप करने की आवश्यकता है: screen -d -m gedit(या screen geditफिर Ctrl+a dअलग करने के लिए) ... और मेरे पास अभी भी पूरी तरह से gedit के टर्मिनल व्यू (चेतावनी संदेशों आदि के लिए) का उपयोग किसी भी समय हो screen -rसकता है, भले ही मैं इस बीच मूल टर्मिनल विंडो को बंद कर दिया है ...
पीटर।

BTW, कुछ चीजें जो आप टर्मिनल के लिए जिम्मेदार हैं, वास्तव में शेल द्वारा की जाती हैं, उदाहरण के लिए &कमांड प्रत्यय की व्याख्या करना । यह स्पष्टीकरण के लिए सहायक हो सकता है: टर्मिनल, कंसोल, शेल और कमांड लाइन में क्या अंतर है?
wjandrea

जवाबों:


17

गेडिट के मामले में, मैं अभी हर समय एक प्रति खोलकर रखता हूं। जब तक आपके पास एक मौजूदा कॉपी चल रही है, geditटर्मिनल से कॉल लॉन्च करना और फिर टर्मिनल को बंद करना gedit को नहीं मारेगा।

अन्य बातों के लिए, अन्य लोगों ने जो कहा है वह भी काम करेगा। मैं एक प्रशंसक हूं nohup... लेकिन अगर आपको एक ऐसे टर्मिनल की आवश्यकता है जिसे आप अलग कर सकते हैं, लेकिन फिर से जोड़ सकते हैं, तो आप देखना चाहते हैं screen

  1. इसे टर्मिनल में चलाएं और फिर कुछ ऐसा चलाएं जो आउटपुट को आगे बढ़ाता रहे। मैं Django विकास सर्वर का उपयोग करता हूं लेकिन irssiया भी watch uptimeअच्छे उदाहरण होंगे।
  2. टर्मिनल को मार डालो और एक नया शुरू करो।
  3. भागो screen -rऔर बूम, तुम वापस अंदर आ गए।

screenइससे बहुत बड़ा है और आप इसे byobuबेहतर टर्मिनल अनुभव के साथ जोड़ सकते हैं । चारों ओर पढ़ें।


यह पहली वास्तविक अंतर्दृष्टि है जो मैंने स्क्रीन के रूप में की है / कर सकता है ... टर्मिनल टिप के लिए धन्यवाद ...
पीटर।

स्क्रीन अब उपलब्ध नहीं है, लेकिन tmux स्क्रीन को बदल सकती है। (tmux एक नया tmux सेशन शुरू करने के लिए, ctrl + b, फिर deatach में d दबाएं, और tmux reattach को संलग्न करें)
Gman Smith

84

मान लें geditकि वह प्रोग्राम है जिसे आप अलग करना चाहते हैं (उर्फ। "विख्यात", "असंतुष्ट", "डिकॉयडाउन")। आप वास्तव में क्या करना चाहते हैं, इसके आधार पर अलग-अलग तरीके हैं:

कार्यक्रम पहले से चल रहा है

त्याग देते:

disown -hयदि आप पहले से चल रहे कार्यक्रम के साथ ऐसा करना चाहते हैं (यानी यदि आप nohupइसे भूल गए हैं) तो जाने का रास्ता है । आपको पहले Ctrl+ का उपयोग करके इसे रोकना होगा Z। तब आप bg [jobId](जैसे bg 1) का उपयोग करके पृष्ठभूमि में रख सकते हैं । आपको उनके जॉब के साथ जॉब चलाने की एक सूची मिलती है jobs। उसके बाद आप टर्मिनल का उपयोग करके इसे डिकॉउप कर सकते हैं disown -h %[jobId]। उदाहरण टर्मिनल सत्र:

$ gedit 
^Z
[1]+  Stopped                 gedit
$ jobs
[1]+  Stopped                 gedit
$ bg 1
[1]+ gedit &
$ disown -h %1
$ exit

कार्यक्रम अभी शुरू नहीं हुआ

nohup

nohupहमेशा सभी मशीनों पर मौजूद नहीं होता है। यदि आप जानते हैं कि आप पहले से उपयोग करना चाहते हैं, तो आप उपयोग करना चाहते हैं:

nohup gedit &

शायद आप शेल आउटपुट को पुनर्निर्देशित करना चाहेंगे और आपका प्रोग्राम एक छद्म इनपुट स्रोत होगा, इसलिए nohup ./myprogram > foo.out 2> bar.err < /dev/null &:। आप आउटपुट को पुनर्निर्देशित करना चाहेंगे या तो इससे नाराज न हों या बाद में इसका उपयोग करें। नल-इनपुट hshups को रोकने में मदद कर सकता है जैसे ssh में।

subshell:

आप एक समान प्रभाव प्राप्त कर सकते हैं

$ (geany >/dev/null 2>&1 &)

कोष्ठक gedit को चलाने के लिए एक नया उपखंड खोलते हैं। >/dev/null 2>&1शेल आउटपुट को कहीं नहीं भेजते हैं (आउटपुट को दबाकर)। और &अंत में प्रक्रिया को पृष्ठभूमि में रखता है।

टर्मिनल मल्टीप्लेक्सिंग

इसके अलावा स्क्रीन या बायोबू का उपयोग करके टर्मिनल मल्टीप्लेक्सिंग । आप मूल रूप से स्वयं के टर्मिनल में प्रोग्राम चलाते हैं। मैं वास्तव में अन्य कारणों से भी बायोबू की सिफारिश कर सकता हूं। नीचे बॉयबू-शॉर्टकट की एक सूची दी गई है जो आपके पहले चरणों के लिए काम आ सकती है:

उपयोगी:

  • F2 एक नई विंडो बनाएँ
  • F3 अगली विंडो पर जाएं
  • F4 पिछली विंडो पर जाएं
  • F6 सत्र और लॉगआउट से अलग करें
  • Shift-F6 सत्र से अलग करें, लेकिन लॉगआउट न करें
  • F7 स्क्रॉलबैक / खोज मोड दर्ज करें
  • Ctrl-F5 किसी भी SSH / GPG सॉकेट या एजेंट को फिर से कनेक्ट करें

कम उपयोगी:

  • Shift-F2 क्षैतिज रूप से स्क्रीन को विभाजित करें
  • Ctrl-F2 स्क्रीन को लंबवत रूप से विभाजित करें
  • Shift-F3 फ़ोकस को अगले विभाजन पर ले जाएँ
  • Shift-F4 पिछले विभाजन पर ध्यान केंद्रित करें
  • Shift-F5 सभी विभाजन को संक्षिप्त करें
  • F5 सभी स्टेटस नोटिफिकेशन को रिफ्रेश करें
  • F8 वर्तमान विंडो का नाम बदलें
  • F9 बायोबू कॉन्फ़िगरेशन मेनू लॉन्च करें
  • F12 GNU स्क्रीन की एस्केप कुंजी
  • Alt-Pageup इस विंडो के इतिहास के माध्यम से वापस स्क्रॉल करें
  • Alt-Pagedown इस विंडो के इतिहास के माध्यम से आगे स्क्रॉल करें
  • Ctrl-a-! बायोबू की कीबाइंडिंग को सभी चालू या बंद करें

'पर' डेमॉन और अन्य

atएक निर्धारित समय में एक कमांड चलाने के लिए एक अच्छा उपयोगी छोटा उपकरण है। शेल से कमांड को अलग करने के लिए इसका 'दुरुपयोग' किया जा सकता है:

echo './myprogram myoption1 myoption2' | at now

इसके अलावा, आप देख सकते हैं setsidऔर start-stop-daemon, लेकिन अन्य तरीकों को पर्याप्त होना चाहिए।


युक्ति: यदि केवल एक नौकरी है, तो नौकरी आईडी वैकल्पिक है, जैसे कि bg %1आप के बजाय बस टाइप कर सकते हैं bg
12

25

रहस्यमय एम्परसेंड "&" प्रत्यय, टर्मिनल को पृष्ठभूमि में डालने का कारण लगता है ... (लेकिन मुझे यकीन नहीं है कि क्या होता है)।

यह करता है, और अक्सर आप क्या चाहते हैं। यदि आप उपयोग करना भूल जाते हैं और आप प्रोग्राम को ctrl-z के साथ निलंबित कर सकते हैं, तो इसे bg कमांड के साथ पृष्ठभूमि में रखें - और उस शेल का उपयोग करना जारी रखें।

प्रक्रिया 'स्टडिन, स्टडआउट, और स्टॉडर अभी भी टर्मिनल से जुड़े हुए हैं; आप उन / से / देव / अशक्त या किसी भी अन्य फ़ाइल को पुनर्निर्देशित कर सकते हैं (जैसे आउटपुट लॉग को कहीं सेव करना), जैसा कि वांछित है:

some-program </dev/null &>/dev/null &
# &>file is bash for 1>file 2>&1

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

कुछ चित्रमय कार्यक्रम टर्मिनल से अलग हो जाएंगे; यदि ऐसा है, तो जब आप "सामान्य रूप से" कमांड चलाते हैं, तो आप देखेंगे कि यह ग्राफिकल प्रोग्राम शुरू करता है और "बाहर निकलता है"।


यहाँ एक छोटी स्क्रिप्ट है , आप इसे ~ / बिन में रख सकते हैं , जिसे मैंने रनबग नाम दिया है:

#!/bin/bash
[ $# -eq 0 ] && {  # $# is number of args
  echo "$(basename $0): missing command" >&2
  exit 1
}
prog="$(which "$1")"  # see below
[ -z "$prog" ] && {
  echo "$(basename $0): unknown command: $1" >&2
  exit 1
}
shift  # remove $1, now $prog, from args
tty -s && exec </dev/null      # if stdin is a terminal, redirect from null
tty -s <&1 && exec >/dev/null  # if stdout is a terminal, redirect to null
tty -s <&2 && exec 2>&1        # stderr to stdout (which might not be null)
"$prog" "$@" &  # $@ is all args

मैं प्रोग्राम ($ प्रोग) को पुनर्निर्देशित करने से पहले देखता हूं ताकि यह पता लगाने में त्रुटि हो। इसे "रनबग योर-कमांड आर्ग्स ..." के रूप में चलाएं; यदि आप आउटपुट को कहीं और सहेजना चाहते हैं, तो आप अभी भी किसी फ़ाइल में स्टडआउट / रीडायरेक्ट कर सकते हैं।

पुनर्निर्देशन और त्रुटि हैंडलिंग के अलावा, यह htorque के उत्तर के बराबर है ।


ठीक है, धन्यवाद ... ऐसा लगता है कि ctrl-z(सस्पेंड) मुझे फिर से कमांड लाइन तक पहुंच देता है, लेकिन जीयूआई को खाली करता है जब तक कि मैं जारी नहीं करता हूं bgजो इसे निलंबित कर देता है। (समझ में आता है) ... क्या कोई अन्य आदेश है जिसके द्वारा मैं GUI को अलग कर सकता हूं ... अहा! अब मैं देख रहा हूँ कि आप क्या मतलब है sighals (kill command)... (दिलचस्प बातें इन संकेतों) .. मैं एक कोड स्निपेट का उपयोग ddउत्तरोत्तर उत्पादन के लिए यह आँकड़े बनाने के लिए किया .. और यह killएक + हस्ताक्षर का इस्तेमाल किया ... वहाँ एक विशिष्ट "नौकरी अलग करने के लिए एक संकेत है "?
पीटर.ऑक्ट

मैंने रिक के उत्तर में आपकी टिप्पणी पर ध्यान दिया ... मैंने disown जॉब्स -p gedit`` की कोशिश की और यह जॉब निकालने के लिए अच्छा लग रहा है .... (लेकिन मुझे टर्मिनल में सिस्टम संदेश मिले जब मैंने मैन्युअल रूप से gedit बंद कर दिया था ... लेकिन मुझे लगता है कि मुझे इस समय एक
पेचीदा

@ पसंदीदा: नौकरियों को शेल द्वारा प्रबंधित किया जाता है, इसलिए कोई भी संकेत इसे नियंत्रित नहीं कर सकता है। आप कई गोले शुरू करने के लिए सबसे अच्छा काम कर सकते हैं - कई GUI टर्मिनल टैब की अनुमति देते हैं और आप स्क्रीन या tmux का उपयोग कर सकते हैं।

2
@ यदि: jobs -p commandयदि आपके पास एक समय में एक कमांड के कई उदाहरण हैं, तो बेहतर नहीं है । आप jobsसही नौकरी आईडी खोजने के लिए उपयोग कर सकते हैं और फिर jobs -p <job-id>नौकरी की पीआईडी ​​प्राप्त कर सकते हैं। निजी तौर पर मुझे उप-संस्करण बहुत आसान है। ;-)
htorque

2
: @htorque, फ्रेड: आप अस्वीकार पैरामीटर के बिना बैश पिछले नौकरी त्याग देते है करने के लिए चला सकते हैंgedit & disown

22

किसी अनुप्रयोग को शुरू करने और उसे लॉन्च किए गए टर्मिनल के उपयोग से अलग करने के लिए & !.

firefox &!

6
जानकर अच्छा लगता है, लेकिन यह केवल zsh लगता है। बैश में आपको disown <pid-of-command>बैकग्राउंड में कमांड शुरू करने के बाद मैन्युअल रूप से चलना होगा ।
हॉर्टेक

दिलचस्प ... मैं zsh में देखने जा रहा हूँ, लेकिन एक लिनक्स नौसिखिया के रूप में, मैं अब के लिए बैश के साथ रहना होगा ... धन्यवाद
पीटर।

विस्मयादिबोधक चिह्न क्या करता है?
नैट्टी

1
! टर्मिनल प्रक्रिया से आवेदन प्रक्रिया को तोड़ देगा ताकि आप उस एप्लिकेशन के बिना टर्मिनल को बंद कर सकें जो समापन से लॉन्च किया गया था। यह एक ज़ीश चीज़ लगती है, लेकिन काम है।
रिक

लेकिन यह भी @htorque bash में काम किया .... तो मुझे लगता है कि यह कोई समस्या नहीं है।
जस्सर

20

उपयोग nohup

nohup एक प्रोग्राम है जो किसी दिए गए कमांड को हैंगअप सिग्नल के साथ चलाता है जिसे अनदेखा किया जाता है, ताकि कमांड पैरेंट प्रोसेस समाप्त होने के बाद बैकग्राउंड में चलती रहे। मैनपेज देखें

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

nohup gedit something

2
क्या है nohup? कृपया विस्तार से बताएं।
ऑक्सविवि

3
nohup एक प्रोग्राम है जो किसी दिए गए कमांड को हैंगअप सिग्नल के साथ चलाता है जिसे अनदेखा किया जाता है, ताकि कमांड पैरेंट प्रोसेस समाप्त होने के बाद बैकग्राउंड में चलती रहे। मैनपेज
फ्लोरियन डाइसच

वास्तव में मुझे लगता है कि मेरा उत्तर यहां गलत है। आगे के विचार पर, nohupइस परिदृश्य में उपयोग किया जाना चाहिए।
बोहेज

2
जब एक इंटरेक्टिव शेल एक SIGHUP सिग्नल प्राप्त करता है, तो वह (या सेटिंग्स के आधार पर) अपने सभी Chds के लिए एक SIGHUP सिग्नल भेज सकता है। टर्मिनल बंद होने पर यह (या फिर नहीं) हो सकता है। एक बच्चा इस तरह के संकेत को संभालने के लिए तैयार नहीं है, डिफ़ॉल्ट कार्रवाई को निष्पादित करेगा, अर्थात बाहर निकलना। nohupआवेदन (और disownबैश निर्मित) संकेत आवेदन तक पहुँचने के लिए अनुमति नहीं है।
एनज़ोटिब

2
इससे सावधान रहने वाली एक बात यह है कि nohupवर्तमान निर्देशिका में एक फ़ाइल बनाई जाती है nohup.out। देखें आदमी पेज अधिक जानकारी के लिए। मैं disownइस कारण से, और disownआपके लॉन्च के बाद काम करने वाले तथ्य के लिए पसंद करता हूं gedit
फ्लिम

4

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


जीएनयू स्क्रीन वास्तव में क्या है?
ऑक्सविवि

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


ऐसा कुछ, केवल बायोबू का उपयोग करना आसान है। अगर मैं गलत हूं तो बायोबू जीएनयू स्क्रीन के लिए सिर्फ एक आसान इंटरफेस है।
रॉबिनजे


1

XDG खुले

इस सामान्य-उद्देश्य उपयोगिता पर एक नज़र डालें: https://linux.die.net/man/1/xdg-open

यह आपके फ़ाइल प्रबंधक में एक सापेक्ष स्थान खोलेगा।

 $ xdg-open .

यह एक पीडीएफ फाइल को पीडीएफ रीडर में खोलेगा।

 $ xdg-open foo.pdf

आप वेब URL भी प्रदान कर सकते हैं

$ xdg-open www.google.com

0

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

nohup gedit & exit

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


0

यह एक स्क्रिप्ट के अंदर भी काम करता है (जैसे उपनाम, 'और' ट्रेलर को आमतौर पर स्क्रिप्ट में अनुमति नहीं दी जाती है क्योंकि वे इंटरैक्टिव नहीं हैं):

bash -i >/dev/null 2>&1 <<<'nohup gedit &'

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.