पृष्ठभूमि में चुपचाप कार्य शुरू करें


12

मुझे पता है कि आप पृष्ठभूमि में एक प्रक्रिया शुरू करने के लिए इसका उपयोग कर सकते हैं, अधिसूचना प्राप्त किए बिना जब प्रक्रिया को पृष्ठभूमि में रखा जाता है और जब ऐसा किया जाता है:

(कमांड और) और> / देव / अशक्त

हालाँकि यह प्रक्रिया समाप्त होने ( trap child_done CHLD) में फंसने के विकल्प को हटा देता है ।

मेरे पास दोनों कैसे हो सकते हैं?

जवाबों:


5

कार्य-स्पूलर आपकी मदद कर सकता है।

जैसा कि freshmeat.net में :

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

टास्क-स्पूलर डेबियन , उबंटू और अन्य डिस्ट्रोस में उपलब्ध है।

यह आपके पास काम करने के लिए और उनके आउटपुट को अपनी इच्छानुसार एक्सेस करने के लिए कार्यों की एक कतार है।

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

$ tsp sleep 5
0 
$ tsp sleep 5 
1
$ tsp
ID   State      Output               E-Level  Times(r/u/s)   Command [run=1/1]
2    running    /tmp/ts-out.ZWn6Le                           sleep 5
1    finished   /tmp/ts-out.Fhlcle   0        5.00/0.00/0.01 sleep 5

यदि आप पृष्ठभूमि में बहुत सारी नौकरियां चलाते हैं, तो यह निश्चित रूप से आपकी मदद करेगी।

आप या तो उन्हें क्रमिक रूप से या स्लॉट की पूर्व निर्धारित मात्रा में चला सकते हैं। तुम भी कार्य के बीच निर्भरता स्थापित कर सकते हैं (चलाने task1 केवल तभी task0 सफलतापूर्वक पूरा कर लिया)।


3

यहाँ दोनों में यह कैसे करना है {ba,z}sh

एक समारोह का उपयोग बचाने के लिए और के राज्य को बहाल करने की जरूरत नहीं मदद करता zshहै monitorके उपयोग के द्वारा चर setopt local_options

# Run the command given by "$@" in the background
silent_background() {
  if [[ -n $ZSH_VERSION ]]; then  # zsh:  https://superuser.com/a/1285272/365890
    setopt local_options no_notify no_monitor
    "$@" &
  elif [[ -n $BASH_VERSION ]]; then  # bash: https://stackoverflow.com/a/27340076/5353461
    { 2>&3 "$@"& } 3>&2 2>/dev/null
  else  # Unknownness - just background it
    "$@" &
  fi
}

इसका उपयोग इस प्रकार है:

trap 'echo child done' CHLD
silent_background sleep 1

अपेक्षित child doneसंदेश देगा।


एक, उम्मीद, स्पष्टीकरण के लिए unix.stackexchange.com/q/456549/4778 देखें ।
ctrl-alt-delor

2

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

यहां, एक उद्धरण जो "बैश संदर्भ मैनुअल", अध्याय "जॉब कंट्रोल", अनुभाग एक से आता है।

शेल प्रत्येक पाइपलाइन के साथ एक जॉब को जोड़ता है। यह वर्तमान में कार्य निष्पादित करने की एक तालिका रखता है, जिसे jobsकमांड के साथ सूचीबद्ध किया जा सकता है । जब बैश अतुल्यकालिक रूप से एक नौकरी शुरू करता है, तो यह एक रेखा को प्रिंट करता है जो दिखता है:

[1] 25647

यह दर्शाता है कि यह नौकरी जॉब नंबर 1 है और इस जॉब से जुड़ी पाइपलाइन में अंतिम प्रक्रिया की प्रक्रिया आईडी 25647 है। एकल पाइपलाइन में सभी प्रक्रियाएं एक ही जॉब की सदस्य हैं। बैश नौकरी नियंत्रण के लिए आधार के रूप में JOB अमूर्त का उपयोग करता है।

ध्यान दें कि एक शेल स्क्रिप्ट इस अधिसूचना को प्रदर्शित नहीं करता है।

$ cat test
#!/bin/bash

true & echo true
$ ./test
true

वास्तव में

Zsh

Zsh प्रलेखन इन सूचनाओं के बारे में समान संकेत प्रदान करता है, देखें man 1 zshmisc, "JOBS" अनुभाग। इन सूचनाओं को प्रदर्शित नहीं किया जाता है जब नौकरी नियंत्रण अक्षम होता है।

MONITOR ( -m , ksh: -m )

    नौकरी पर नियंत्रण की अनुमति दें। इंटरेक्टिव शेल में डिफ़ॉल्ट रूप से सेट करें।

zsh_prompt % setopt no_monitor
zsh_prompt % true & echo true
true
zsh_prompt %
zsh_prompt % 

दे घुमा के

ऐसा लगता है कि बैश हमेशा उदाहरण के लिए प्रदर्शित होता है [1] 25647। "अंतिम अधिसूचना" जैसे [1]+ Done trueकि नौकरी नियंत्रण को अक्षम करने पर प्रदर्शित नहीं किया जाता है।

bash_prompt $ true & echo true
[1] 25647
true
bash_prompt $ 
[1]+  Done                    true

नौकरी पर नियंत्रण अक्षम

bash_prompt $ set +m       # disable job control
bash_prompt $ true & echo true
[1] 25685
bash_prompt $
bash_prompt $

निष्कर्ष

मुझे नहीं पता कि नोटिफिकेशन को छिपाने के लिए जॉब कंट्रोल को डिसेबल करना अच्छी बात है?

साधन


1

आप zshनौकरी सूचनाओं को अक्षम करने के लिए एक गैर-इंटरैक्टिव शेल के रूप में आह्वान कर सकते हैं ।

zsh -c '
   trap "echo trapped child_done" CHLD
   sleep 5 &
   #wait
   sleep 10 # simulate other running cmds
   echo script done
'

0

निम्नलिखित उदाहरण देखें:

trap 'echo "DONE"' 0
{ find /usr & } &> /dev/null
wait

यह अच्छा काम करता है। कोई ज़रूरत नहीं ( ): जो एक ज़रूरत नहीं है सबस्क्रिप्शन। { }सिर्फ ग्रुपिंग कमांड्स हैं।


कि प्रिंट [2] 49591और [2] + 49591 exit 1 find /usr, जब यह न तो इनमें से प्रिंट करना चाहिए!
टायिलो

क्षमा करें, आपके प्रश्न को गलत समझा।
गिल्स क्वेनोट

0

यह एक पुराना प्रश्न है, लेकिन एक संभावित उत्तर (बाश में, zsh के साथ परीक्षण नहीं किया गया है) को उपधारा में नौकरी नियंत्रण का उपयोग करना है: (command & wait)

नोट: बैश प्रारंभ / अंत बैकग्राउंड जॉब मैसेजेस को सबस्क्रिप्शन में दबा देता है, और पुनर्निर्देशन की कोई आवश्यकता नहीं है।


मुझे लगता है कि आप जाल के साथ भाग से चूक गए। जहां तक ​​मैं समझता हूं कि प्रश्न को उपप्रकार शुरू किया जाना चाहिए, तो कुछ किया जाएगा जबकि समप्रपात निष्पादित होता है और फिर जब उपप्रकार समाप्त हो जाता है तो कुछ और निष्पादित किया जाना चाहिए। अपने समाधान के साथ आप उपप्रकार प्रारंभ करें इसके लिए सबस्क्रिप्शन में प्रतीक्षा करें और मुख्य शेल उप-संस्करण के लिए प्रतीक्षा करता है। इससे संदेशों से छुटकारा मिल जाता है, लेकिन आप समानांतर में कुछ नहीं कर सकते।
राफेल एहरेंस

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