मेरे पास बैश में outer-script.sh नामक फाइल में निम्नलिखित विधि है:

test_service() {
    nohup java -jar target/outer-runner.jar > service.log 2>&1&
    echo $! > runner-process.pid
    ./inner-script.sh
    kill `cat runner-process.pid`
}

inner-script.sh outer-script.sh set -e को set -e में फेंक सकते हैं, इसलिए यदि बाहरी exit 1 फेंकता है तो बाहरी स्क्रिप्ट चलना बंद हो जाएगी। यह सब अच्छा है, लेकिन यह विफलता की स्थिति में kill लाइन को कॉल नहीं करता है!

मैंने जोड़ने की कोशिश की है

trap "{ kill `cat runner-process.pid` }" EXIT

test_service() के समापन कोष्ठक के ठीक नीचे लेकिन असफलता की स्थिति में मुझे त्रुटि मिलती है

./outer-script.sh: exit trap: line 2: syntax error: unexpected end of file

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

यह सुनिश्चित करने का सही तरीका क्या है कि inner-script.sh exit 1 के साथ लौटने पर यह प्रक्रिया समाप्त हो जाती है?

1
Ben Watson 4 पद 2015, 20:11

2 जवाब

सबसे बढ़िया उत्तर

प्रयत्न

trap '{ kill $(< runner-process.pid) ; }' EXIT

मुझे यकीन नहीं है कि आपको सिंगल-कोट्स वीएस डबल-कोट्स की जरूरत है, लेकिन मैं आम तौर पर सिंगल कोट्स का इस्तेमाल करना पसंद करता हूं, जब मैं कुछ ऑर्डर-ऑफ-मूल्यांकन मुद्दों को खत्म कर सकता हूं।

किसी भी प्रक्रिया समूह { ... ; } ({} के अंदर) बनाने के लिए, आपको समापन } चार से पहले ; एक समाप्ति की आवश्यकता है।

$(< pidFile) का उपयोग करना फ़ाइल की सामग्री को हथियाने के लिए एक अधिक प्रक्रिया कुशल आशुलिपि है। सामान्य रूप से < के बारे में सोचें। मुझे भी।

$( ..cmds ..) बैक-टिक cmd प्रतिस्थापन का आधुनिक संस्करण है। 90 के दशक में शामिल हों और बैक-टिक्स का उपयोग करना बंद करें, जब तक कि आपको असली बॉर्न शेल /bin/sh के तहत चलाने के लिए अपने कोड की आवश्यकता न हो।

IHTH

1
shellter 4 पद 2015, 18:39

set -e का उपयोग करने के बजाय, निम्नलिखित सिंटैक्स का उपयोग करें:

./inner-script.sh || { kill `cat runner-process.pid`; exit 1; }

अगर भीतर- script.sh विफल हो जाता है, तो यह || के बाएं-हाथ की अभिव्यक्ति को मार देगा और मार देगा।

2
Aaron 4 पद 2015, 17:19