"और" के बिना पृष्ठभूमि में प्रक्रियाएं


24

मान लें कि आपने लिनक्स में एक नया एप्लिकेशन शुरू किया है (जैसे टेक्स्ट एडिटर, आदि), लेकिन आप "&" का उपयोग करना भूल गए। उस प्रक्रिया को पृष्ठभूमि में चलाने के लिए आप किस आदेश का उपयोग करेंगे, जबकि उस एप्लिकेशन को बंद नहीं करना है? इस तरह, आपके पास दोनों प्रक्रियाएं खुली और अलग-अलग काम कर सकती हैं (उदाहरण के लिए, कमांड लाइन टर्मिनल जो आपने प्रक्रिया बनाने के लिए इस्तेमाल किया था और प्रक्रिया जैसे कि एक पाठ संपादक अभी भी चल रहा है।)


तकनीकी रूप से नहीं, लेकिन शायद tmuxआपके प्रश्न में वांछित रूप से समान कार्यक्षमता देता है।
एमके

1
जब संभव हो तो एक और खोल खोलने के सरल विकल्प को नजरअंदाज न करें।
jpmc26

जवाबों:


43

टर्मिनल विंडो में आप आमतौर पर Control+ Zको प्रक्रिया को "निलंबित" करने के लिए टाइप करेंगे और फिर bgइसे "बैकग्राउंड" करने के लिए कमांड का उपयोग करेंगे।

जैसे नींद की आज्ञा से

$ /bin/sleep 1000
^Z[1] + Stopped                  /bin/sleep 1000
$ bg
[1]     /bin/sleep 1000&
$ jobs
[1] +  Running                 /bin/sleep 1000
$ 

हम देख सकते हैं कि प्रक्रिया चल रही है और मेरे पास अभी भी मेरी कमांड लाइन है।


5
यह जोड़ना दिलचस्प हो सकता है कि प्रक्रिया को fgकमांड के साथ अग्रभूमि में वापस लाया जा सकता है , जो 1एक पैरामीटर के रूप में कार्य आईडी (कोष्ठक में निर्दिष्ट ) लेता है । यह उपयोग करने के लिए विशिष्ट नहीं है bgऔर इसके साथ शुरू की गई प्रक्रियाओं पर किया जा सकता है &
हारून

14

Ctrl+ Zइसे करने का तरीका है, लेकिन सिर्फ पूर्णता के लिए: सवाल "कमांड" के लिए पूछता है, और वह (दूसरे टर्मिनल से) होगा:

kill -STOP pid_of_the_running_applications

और फिर निश्चित रूप से

bg

एप्लिकेशन टर्मिनल से।


6
kg -STOP, और फिर मार डालो -Content
मिशेल Billaud

10

बैश में:

Ctrl+ Zऔर फिर bg

अब रन करें jobsऔर परिणाम देखें।


2
@grooveplex टॉमस ने पहले उत्तर दिया, इसलिए स्टीफन के जवाब के नीचे टिप्पणी करना अधिक उचित होगा, कि उनका मूल रूप से टॉमस का उत्तर कुछ और विवरण के साथ है।
एंथन

2
हमने वास्तव में समवर्ती उत्तर दिया। आश्चर्य की बात नहीं है कि हम दोनों ने एक ही बात कही क्योंकि यह स्पष्ट उत्तर है :-) हम दोनों ने दूसरे की नकल नहीं की। मेरा जवाब थॉमस के तुरंत बाद आया 'क्योंकि मैं उदाहरण बनाने और प्रारूपण करने में अतिरिक्त समय लगाता हूं।
स्टीफन हैरिस

1
और मेरा कहना है कि यह बैश में है, इसलिए वे समान नहीं हैं।
टॉमाज़

1
हे, वहाँ एक संभावित बिंदु है। इसके लिए शेल को नौकरी पर नियंत्रण की आवश्यकता होती है। कुछ पहली मशीनों पर मैंने काम किया (SVr2 आधारित) में ऐसा नहीं था /bin/shऔर इसलिए यह काम नहीं करेगा :-)
स्टीफन हैरिस

1

प्रेस करने की असुविधा के लिए एक निवारक उपाय के रूप में CTRL- zआप अपने संपादक के लिए एक आवरण स्क्रिप्ट बना सकते हैं, जो आपके संपादक को पृष्ठभूमि में चलाएगी। इस तरह से आपको पृष्ठभूमि में इसे स्पष्ट रूप से शुरू करने के लिए याद रखने की आवश्यकता नहीं होगी:

    #!/bin/sh

    EDITOR="emacs" # or whatever

    if [ -z "${DISPLAY}" ]; then
      ${EDITOR} "$@"
    else
      ${EDITOR} "$@" &
    fi

ऊपर हम पहले यह निर्धारित करने का प्रयास करते हैं कि क्या आपके पास एक्स सर्वर उपलब्ध है और उसके बाद ही पृष्ठभूमि में संपादक चलाएं (यदि नहीं, तो कई यूनिक्स संपादक आपके टर्मिनल का उपयोग करेंगे और आप इस मामले में पृष्ठभूमि प्रक्रिया के रूप में संपादक को चलाना नहीं चाहते हैं) । यह आपकी पसंद के संपादक के लिए सभी दलीलें पास कर देगा "$@", जैसे कि आपने रैपर स्क्रिप्ट के लिए प्रदान किया था।

कमांड के रूप में आप गायब हैं ... मेरे मूल प्रयोग के अनुसार, GUI कार्यक्रमों के लिए जो टर्मिनल को शामिल नहीं करते हैं, यह पहले भेजने SIGSTOPऔर फिर SIGCONTअग्रभूमि प्रक्रिया के रूप में सरल हो सकता है ( killकमांड का उपयोग करके यदि आप इसे लागू करने के लिए शेल स्क्रिप्ट का उपयोग करते हैं) । आपको निश्चित रूप से इसे किसी अन्य टर्मिनल विंडो / टैब में चलाने की आवश्यकता होगी, और कठिनाई आसानी से और जेनेरिक फैशन में उस पीआईडी ​​को खोजने के लिए होगी जिसे आप अपना सिग्नल भेजना चाहते हैं। आप डिफ़ॉल्ट रूप से दिए गए नाम की सभी प्रक्रियाओं को दो संकेत भेज सकते हैं (अपने पसंदीदा संपादक को डिफ़ॉल्ट करना और पीआईडी ​​का उपयोग तर्क के रूप में भी करना चाहते हैं):

    #!/bin/sh

    EDITOR=emacs # whatever

    stop_cont_prog()
    {
      case "$1" in
        # begin with number is considered PID - this is not good 
        # enough to be taken seriously...
        [1-9]*) kill -SIGSTOP "$1"; kill -SIGCONT "$2";;
        *)      killall -SIGSTOP "$1"; killall -SIGCONT "$2";;
      esac
    }

    if [ -n "$1" ]; then
      for prog in "$@"; do stop_cont_prog "$1"; done
    else  
      stop_cont_prog "${EDITOR}"
    fi

इस पद्धति ने emacsपृष्ठभूमि में चलने (कई) कमांड के बाद मुझे अपने टर्मिनल टैब को सही ढंग से दिया । लेकिन शेल में चल रही emacs प्रक्रिया को शेल जॉब नियंत्रण या टर्मिनल सेटिंग भ्रम के कारण ठीक से बहाल नहीं किया गया था। तो इस विधि को कुछ परिष्कार से लाभ होगा।

SIGSTOPवास्तव में क्या अग्रभूमि प्रक्रिया जब आप (आम चूक से) प्रेस करने भेज रहा है CTRL- zstty -aआउटपुट का संदर्भ लें

$ stty -a
speed 38400 baud; rows 50; columns 200; line = 0;
intr = ^C; [...] start = ^Q; stop = ^S; susp = ^Z; [...]
[...]

(आउटपुट संक्षिप्त) और sttyमैनुअल पेज:

   susp CHAR
          CHAR will send a terminal stop signal

SIGSTOPसिग्नल का उपयोग कर बंद की गई प्रक्रियाओं को भेजकर पुनः आरंभ किया जा सकता है SIGCONT। आम तौर पर यह शेल जॉब कंट्रोल लॉजिक होता है जो हमें भेजने और आदेशों से SIGCONTजुड़े अन्य आवश्यक जोड़तोड़ का ध्यान रखेगा fgऔर bgजिन्हें हम नजरअंदाज करते हैं।

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