जब तक पृष्ठभूमि की प्रक्रिया समाप्त नहीं होती है, तब तक कार्य क्यों नहीं होगा?


21

इस लिपि पर विचार करें:

#!/bin/bash
function start {
  leafpad &
  echo $!
}
PID=$(start)
echo "PID is $PID"

जब तक यह एक पृष्ठभूमि प्रक्रिया नहीं होती है, तब तक स्क्रिप्ट अपने समापन ब्रेस को जारी नहीं रखती है।

ऐसा क्यों है? क्या एक समारोह से पृष्ठभूमि प्रक्रिया शुरू करना संभव है?

जवाबों:


22

फ़ंक्शन लौटता है, लेकिन कमांड प्रतिस्थापन ब्लॉक, क्योंकि आपने पृष्ठभूमि नौकरी बनाई है, लेकिन आपके पास अभी भी अपना स्टडआउट एफडी खुला है। बस के आगे जोड़कर इसे बंद >/dev/nullकरें &

#!/bin/bash
function start {
  leafpad >/dev/null &
  echo $!
}
PID=$(start)
echo "PID is $PID"

यदि आप चाहते हैं कि आपकी प्रक्रिया में भी गतिरोध, गतिरोध, स्टैडर बंद हो, तो इसका उपयोग करें:

leafpad >/dev/null 0>&1 2>&1 &

यह stdin (0), stdout (1), और stderr (2), फिर बैकग्राउंड (&) को बंद करेगा। इसके अलावा, जब इन धाराओं का उपयोग करते हुए पुनर्निर्देशन भूल जाते हैं कि वे "धोखा" नहीं देते हैं, तो इसका अर्थ है कि निष्पादन के क्रम में नकल की गई है।

1>/dev/null 2>&1

तथा

2>&1 1>/dev/null

वह सामान नहीं है ! पूर्व में, आप एक स्ट्रीम को / dev / null (जो आप चाहते हैं) में दोहरा रहे हैं, बाद में, आप stderr को / devd / stdout को डुप्लिकेट कर रहे हैं, और फिर, stdout को बंद कर रहे हैं। इसलिए भेजा गया कोई भी संदेश stderrआपके कंसोल में दिखाई देगा।


मेरे सिस्टम पर पुष्टि की गई
user120161

10
आप धाराएँ बंद नहीं कर रहे हैं, आप उन्हें पुनर्निर्देशित कर रहे हैं।
dcat

4
बंद कर देना; फ़ाइल डिस्क्रिप्टर n>&-कहाँ nहै।
dcat

1
@dcat: हां, लेकिन /dev/nullजब कोई प्रक्रिया अपने स्टैडआउट को लिखने की कोशिश करती है, तो मुझे इनडायरेक्ट / इन से कोई त्रुटि नहीं होगी, लेकिन पाता है कि 1यह एक अमान्य FD है। इसलिए पोस्ट में शब्दावली गलत है, न कि वास्तविक बैश प्रोग्रामिंग। (वास्तव में, एफडी 1 से 0 को डुप्लिकेट करने का मतलब है कि स्टडिन एक फाइल-डिस्क्रिप्टर के साथ खोला O_RDONLYजाएगा, जो संभवतः प्रक्रिया को पढ़ने की कोशिश करने पर एक त्रुटि देगा (वांछित नो-बाइट्स-उपलब्ध के बजाय)। उदाहरण के लिए wc >/dev/null 0>&1->wc: standard input: Bad file descriptor
पीटर कॉर्ड्स

1
@PeterCordes - पुराने डिस्क्रिप्टर को बंद करना और नए को पुनर्निर्देशित करना पारस्परिक रूप से अनन्य नहीं होना चाहिए। exec <&- >&- <>/dev/null >&0बहुत थकावट से / बाहर संभालती है। यह zshकम से कम में एक अंतर बनाता है जो मल्टीसैट सेट होने पर एक ही विवरणक पर स्वचालित रूप से सभी को खोलता है।
माइकस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.