bash - पृष्ठभूमि में उपप्रक्रिया चलाने के लिए एम्परसेंड(&) का उपयोग करते समय चलने वाली स्क्रिप्ट टर्मिनल पर वापस नहीं आती है




shell scripting (2)

लिनक्स प्रलेखन प्रोजेक्ट से निम्नलिखित लिंक बताता है कि child.sh में अपने mail कमांड के wait बाद wait :

http://tldp.org/LDP/abs/html/x9644.html

उपरोक्त दस्तावेज़ का सारांश

Within a script, running a command in the background with an ampersand (&)
may cause the script to hang until ENTER is hit. This seems to occur with
commands that write to stdout. It can be a major annoyance.

....
....

As Walter Brameld IV explains it:

As far as I can tell, such scripts don't actually hang. It just
seems that they do because the background command writes text to
the console after the prompt. The user gets the impression that
the prompt was never displayed. Here's the sequence of events:

1. Script launches background command.
2. Script exits.
3. Shell displays the prompt.
4. Background command continues running and writing text to the
   console.
5. Background command finishes.
6. User doesn't see a prompt at the bottom of the output, thinks script
   is hanging.

यदि आप निम्न को देखने के लिए child.sh बदलते हैं तो आपको इस झुंझलाहट का अनुभव नहीं करना चाहिए:

#!/bin/bash
java com.test.Main
echo "Main Process Stopped" | mail -s "WARNING-Main Process is down." [email protected].com
wait

या @ सिबेस्टियनस्टिग्लर के रूप में ऊपर दिए गए आपके प्रश्न पर एक टिप्पणी में कहा गया है:

Add a > /dev/null at the end of the line with mail. mail will otherwise try to start its interactive mode.

यह मेल कमांड को stdout बजाय /dev/null पर लिखने के लिए कारण होगा, जिसे इस झुंझलाहट को भी रोकना चाहिए।

उम्मीद है की यह मदद करेगा

मेरे पास एक स्क्रिप्ट है (इसे parent.sh कहते हैं) जो 2 कॉल को दूसरी स्क्रिप्ट (child.sh) बनाता है जो एक जावा प्रक्रिया चलाती है Child.sh स्क्रिप्ट पृष्ठभूमि में एक और parent.sh में रेखा के अंत में रखकर चलती है हालांकि, जब मैं parent.sh चलाता हूं, मुझे टर्मिनल स्क्रीन पर वापस जाने के लिए Ctrl + C दबाकर रखना होगा। इसका कारण क्या है? क्या यह तथ्य है कि child.sh प्रक्रिया parent.sh प्रक्रिया के तहत चल रही है के साथ ऐसा कुछ है तो क्या माता पिता नहीं करते जब तक parent.sh मर नहीं जाती?

parent.sh

#!/bin/bash
child.sh param1a param2a &
child.sh param1b param2b &
exit 0

child.sh

#!/bin/bash
java com.test.Main 
echo "Main Process Stopped" | mail -s "WARNING-Main Process is down." [email protected].com    

जैसा कि आप देख सकते हैं, मैं पृष्ठभूमि में जावा प्रक्रिया को चलाने के लिए नहीं चाहता क्योंकि मैं प्रक्रिया समाप्त होने पर मेल भेजना चाहता हूं। इसके रूप में कार्य करना एक कार्यशील दृष्टिकोण से ठीक काम करता है, लेकिन मैं यह जानना चाहूंगा कि कैसे parent.sh निष्पादित करने के बाद मैं इसे टर्मिनल पर वापस कर सकता हूं।


मैंने जो कुछ किया वह समाप्त करने के लिए किया गया था parent.sh को निम्नलिखित में बदलने के लिए

#!/bin/bash
child.sh param1a param2a > startup.log &
child.sh param1b param2b > startup2.log &
exit 0

मैं आपके समाधान के बिना और इस मुद्दे के मूल कारण विश्लेषण के बिना इस समाधान में नहीं आया होता। धन्यवाद!

और मेरी गलत टिप्पणी के लिए माफी (कोई इनपुट नहीं था, मैं स्मृति से उत्तर दिया और मुझे गलत याद आया।)





ampersand