मैं एक कमांड कैसे चला सकता हूं जो टर्मिनल के करीब बच जाएगा?


313

कभी-कभी मैं एक प्रक्रिया शुरू करना चाहता हूं और इसके बारे में भूल जाता हूं। अगर मैं इसे कमांड लाइन से शुरू करता हूं, जैसे:

redshift

मैं टर्मिनल बंद नहीं कर सकता, या यह प्रक्रिया को मार देगा। क्या मैं इस तरह से कमांड चला सकता हूं कि मैं बिना प्रक्रिया को मारे टर्मिनल को बंद कर सकता हूं?


4
सभी डिस्ट्रोस पर एक डिफ़ॉल्ट इंस्टॉल नहीं है, लेकिन स्क्रीन आपका मित्र है: en.wikipedia.org/wiki/GNU_Screen
ज़ैन एस हल्सल

समान समस्या का सामना करने वाले व्यक्ति को: याद रखें, कि भले ही आप टाइप करें yourExecutable &और आउटपुट स्क्रीन पर आते रहें और Ctrl+Cकुछ भी बंद न हो, बस आँख बंद करके टाइप करें disown;और Enterस्क्रीन को आउटपुट के साथ स्क्रॉल करने पर भी दबाएं और आप यह नहीं देख सकते कि क्या आप टाइप कर रहे हैं। यह प्रक्रिया समाप्त हो जाएगी और आप बिना प्रक्रिया के मरने के बाद टर्मिनल को बंद कर पाएंगे।
नव

आप स्क्रीन मल्टीप्लेयर का उपयोग कर सकते हैं जैसे tmux । यह ubuntu मशीनों पर apt-get के माध्यम से उपलब्ध है
हिमांशु

जवाबों:


311

निम्नलिखित 2 में से एक को काम करना चाहिए:

$ nohup redshift &

या

$ redshift &
$ disown

यह कैसे काम करता है इसके बारे में थोड़ी और जानकारी के लिए निम्नलिखित देखें:


5
दूसरे redshift & disownने ( ) मेरे लिए उबंटू 10.10 पर काम किया। यह एक लाइन पर यह सब डाल ठीक काम करने लगता है। क्या कोई कारण है कि मुझे ऐसा नहीं करना चाहिए?
मैथ्यू

4
@ मैथ्यू पहले को भी ठीक काम करना चाहिए, यह सिर्फ दूसरे की तरह पृष्ठभूमि नहीं करता है (आप संभवतः चाहते हैं nohup redshift &कि यह पृष्ठभूमि करता है)। और एक लाइन पर दूसरी डाल ठीक है, हालांकि आम तौर पर आप के साथ अलग है ;( redshift &; disown)
माइकल Mrozek

10
@Michael: दोनों ;और &आदेश विभाजक कर रहे हैं और बराबर पूर्वता है। एकमात्र अंतर सिंक्रोनस बनाम एसिंक्रोनस निष्पादन (क्रमशः) है। &;वरीयता में उपयोग करने की आवश्यकता नहीं है &(यह काम करता है, लेकिन यह थोड़ा बेमानी है)।
क्रिस जॉन्सन

4
अच्छा जवाब, एक जोड़ सकता है कि यह एक अच्छा विचार है कि स्टडआउट और स्टेडर को पुनर्निर्देशित किया जाए ताकि डिबग आउटपुट के साथ टर्मिनल को स्पैम नहीं किया जाएगा
किम

12
इसके अलावा, redshift &!तुरंत लाल रंग को भंग कर देगा।

143

यदि आपका प्रोग्राम पहले से चल रहा है, तो आप इसे रोक सकते हैं Ctrl-Z, इसे पृष्ठभूमि में खींच सकते हैं bgऔर फिर disownइसे इस तरह से कर सकते हैं:

$ sleep 1000
^Z
[1]+  Stopped                 sleep 1000
$ bg
$ disown
$ exit

3
के बाद कैसे मैं फिर से चल रहे प्रक्रिया के stdout पढ़ सकते हैं?
नेकटविले


1
यह मेरे लिए किसी कारण (सेंटो) के लिए काम नहीं करता था
इयान

इस प्रक्रिया के बाद प्रक्रिया को कैसे मारना है?
पलक दरजी

2
@necktwi disownstdout या stderr को डिस्कनेक्ट नहीं करता है। हालाँकि nohup, जैसा कि करता है >/dev/null(मानक को डिस्कनेक्ट करें), 2>/dev/null(मानक त्रुटि को डिस्कनेक्ट करें)। यह ( disown) नौकरी-नियंत्रण को काट देता है।
ctrl-alt-delor

45

अच्छा उत्तर पहले से ही @StevenD द्वारा पोस्ट किया गया है, फिर भी मुझे लगता है कि यह इसे थोड़ा और स्पष्ट कर सकता है।

टर्मिनल को समाप्त करने पर प्रक्रिया के मारे जाने का कारण यह है कि आपके द्वारा शुरू की जाने वाली प्रक्रिया टर्मिनल की एक बाल प्रक्रिया है। एक बार जब आप टर्मिनल बंद कर देते हैं, तो यह इन बाल प्रक्रियाओं को भी मार देगा। आप कोनसोल में pstreeचलने पर उदाहरण के लिए, प्रक्रिया के पेड़ को देख सकते हैं kate &:

init-+
     ├─konsole─┬─bash─┬─kate───2*[{kate}]
     │         │      └─pstree
     │         └─2*[{konsole}]

जब आप समाप्त करते हैं तो इस kateप्रक्रिया को अलग करने के लिए , इस तरह से कमांड का उपयोग करें:konsolekonsolenohup

nohup kate &

बंद करने के बाद konsole, pstreeइस तरह दिखेगा:

init-+
     |-kate---2*[{kate}]

और kateबचेगा। :)

एक विकल्प screen/ tmux/ का उपयोग कर रहा है byobu, जो शेल को चालू रखेगा, टर्मिनल से स्वतंत्र होगा।


मुझे अव्यवस्थित तरीकों से समस्या थी। यह वर्तमान में मेरे लिए काम कर रहा है, इसलिए upvoting। मुझे यह भी पसंद है क्योंकि मैं no -up को पूँछ सकता हूँ। यह देखने के लिए कि क्या हो रहा है, लेकिन मेरे सत्र के विफल होने के बारे में चिंता न करें
इयान

27

आप इस तरह की प्रक्रिया को टर्मिनल में चला सकते हैं

setsid process

यह एक नए सत्र में कार्यक्रम चलाएगा। जैसा कि समझाया गया http://hanoo.org/index.php?article=run-program-in-new-session-linux


1
क्या आप nohup पर सेटिड के फायदे के रूप में देखते हैं?
इसका कर्क

1
1) यह एक कष्टप्रद संदेश के बारे में नहीं छापता है nohup.out। 2) यह आपके शेल की नौकरी की सूची में नहीं रहता है, इसलिए यह आउटपुट को अव्यवस्थित नहीं करता है jobs
मिकेल

यह एकमात्र समाधान है जो स्क्रिप्ट के साथ काम करता है जो lxterminal में चलता है, pcmanfm और बाहर निकलता है (साथ ही टर्मिनल बंद होने के दौरान pcmanfm चालू रहता है)। आपको बहुत - बहुत धन्यवाद!
desgua

9

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

आप इसे शुरू करने पर विचार कर सकते हैं । स्क्रीन को लगभग सभी लिनक्स और यूनिक्स डेरिवेटिव पर स्थापित किया जा सकता है। हिटिंग + और (निचला मामला) दूसरा सत्र शुरू करेगा। यह आपको प्रारंभिक सत्र के बीच में आगे और पीछे + और या फिर नए सत्र से टकराने + और टकराने की अनुमति देगा । आपके एक टर्मिनल में दस सत्र हो सकते हैं। मैं काम पर एक सत्र शुरू करता था, घर जाता था, अपने काम की मशीन में जाता था, और फिर आह्वान करता था । यह आपको उस दूरस्थ सत्र में फिर से कनेक्ट कर देगा।screen -S session_nameCtrlACCtrlA0CtrlA1screen -d -R session_name


screen -d -m commandपहले से ही अलग स्क्रीन के भीतर इसे शुरू करेंगे: ~# screen -d -m top ~# screen -ls There is a screen on: 10803..Server-station (Detached) 1 Socket in /root/.screen. ~# screen -x .... और आप अंदर हैं।
डॉ। अलेक्जेंडर

7

यह सब करने का शेल-ओनली तरीका है स्टड को बंद करना और कमांड को बैकग्राउंड करना:

command <&- & 

जब आप शेल को छोड़ेंगे तो यह नहीं चलेगा। रिडायरेक्टिंग स्टडआउट एक अच्छा वैकल्पिक काम है।

नुकसान यह है कि आप इस तथ्य के बाद ऐसा नहीं कर सकते।


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

7

मेरे पास एक स्क्रिप्ट है:

  • पृष्ठभूमि में मनमाना कमांड चलाएं

  • उन्हें टर्मिनल विंडो के साथ मारे जाने से रोकें

  • उनके उत्पादन को दबाएं

  • बाहर निकलने की स्थिति संभालती है

मैं इसे मुख्य रूप से gedit, आदि के लिए उपयोग करता हूं evince, inkscapeजिसमें सभी में बहुत सारे कष्टप्रद टर्मिनल आउटपुट होते हैं। यदि कमांड पहले खत्म हो जाती है TIMEOUT, तो शून्य के बजाय नोह की निकास स्थिति वापस आ जाती है।

#!/bin/bash

TIMEOUT=0.1

#use nohup to run the command, suppressing its output and allowing the terminal to be closed
#also send nohup's output to /dev/null, supressing nohup.out
#run nohup in the background so this script doesn't block
nohup "${@}" >/dev/null 2>&1 &
NOHUP_PID=$!

#kill this script after a short time, exiting with success status - command is still running
#this is needed as there is no timeout argument for `wait` below
MY_PID=$$
trap "exit 0" SIGINT SIGTERM
sleep $TIMEOUT && kill $MY_PID 2>/dev/null & #ignore "No such process" error if this exits normally

#if the command finishes before the above timeout, everything may be just fine or there could have been an error
wait $NOHUP_PID
NOHUP_STATUS=$?
#print an error if there was any. most commonly, there was a typo in the command
[ $NOHUP_STATUS != 0 ] && echo "Error ${@}"
#return the exit status of nohup, whatever it was
exit $NOHUP_STATUS

उदाहरण...

>>> run true && echo success || echo fail
success
>>> run false && echo success || echo fail
Error false
fail
>>> run sleep 1000 && echo success || echo fail
success
>>> run notfound && echo success || echo fail
Error notfound
fail

6

मैं पसंद करता हूं:

(आवेदन का नाम &)

उदाहरण के लिए: linux@linux-desktop:~$ (chromium-browser &)

जब कमांड टाइप करें तो कोष्ठक का प्रयोग अवश्य करें!


1
टर्मिनल को बंद करने से यह प्रक्रिया समाप्त हो जाएगी , जो वास्तव में ओपी (और मुझे, इस प्रकार यहां आकर) बचना चाहती है
gromit190

संभवतः आपके पास प्रॉम्प्ट कमांड है जो मैंने अपने उत्तर में कोष्ठक के बिना उपयोग किया है, यदि ऐसा करने से टर्मिनल बंद हो जाता है तो यह प्रक्रिया समाप्त हो जाएगी, अन्यथा ऐसा नहीं होगा। मैंने पहले ही ऊपर दिए गए समाधान को स्पष्ट कर दिया है।
daGo

मेरे लिए काम करें, tnx
noadev

मैं सोच रहा हूं कि यह अधिक उत्थान क्यों नहीं हुआ। nohupकिसी भी tty आउटपुट को रोकता है और मैं वास्तव में आउटपुट को किसी फ़ाइल में रीडायरेक्ट करना चाहता था और यह रोकता है कि यह मेरे लिए बेहतर समाधान है।
redanimalwar

4

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

nohup -p PID

3

अपोलिन्स्की द्वारा प्रस्तुत उत्तर के समान , मैं एक संस्करण का उपयोग करता हूं screen। वेनिला कमांड इस तरह है

screen bash -c 'long_running_command_here; echo; read -p "ALL DONE:"'

सत्र के साथ डिस्कनेक्ट किया जा सकता है Ctrl ACtrl Dऔर सरल मामले में फिर से जोड़ा जा सकता है screen -r। मैंने इसे एक स्क्रिप्ट में लपेटा है जो सुविधाजनक उपयोग के लिए sessionमेरी PATHतैयार में रहती है :

#!/bin/bash
#
if screen -ls | awk '$1 ~ /^[1-9][0-9]*\.'"$1"'/' >/dev/null
then
    echo "WARNING: session is already running (reattach with 'screen -r $1')" >&2
else
    exec screen -S "$1" bash -c "$@; echo; echo '--------------------'; read -p 'ALL DONE (Enter to exit):'"
    echo "ERROR: 'screen' is not installed on this system" >&2
fi
exit 1

यह केवल तभी काम करता है जब आप पहले से जानते हैं कि आप किसी प्रोग्राम को डिस्कनेक्ट करना चाहते हैं। यह पहले से चल रहे प्रोग्राम को डिस्कनेक्ट करने के लिए प्रदान नहीं करता है ।


2

पहले से पोस्ट किए गए अन्य उत्तरों के समान, कोई भी पुनरावृत्ति के लिए "स्क्रीन" पूर्वव्यापी रूप से उपयोग करने के लिए एक रनिंग प्रक्रिया को स्थानांतरित कर सकता है और फिर टर्मिनल को बंद कर सकता है। इस पोस्ट में चरणों का वर्णन किया गया है । कदम उठाने के लिए कर रहे हैं:

  1. प्रक्रिया को निलंबित करें
  2. पृष्ठभूमि में प्रक्रिया फिर से शुरू करें
  3. प्रक्रिया को अस्वीकृत कर दिया
  4. एक स्क्रीन सत्र शुरू करें
  5. प्रक्रिया के पीआईडी ​​का पता लगाएं
  6. प्रक्रिया को संभालने के लिए पुनरावृत्ति का उपयोग करें
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.