आवरण लिपियों में निष्पादन का कारण


27

मैंने रैपर स्क्रिप्ट के उदाहरण देखे हैं जो संक्षेप में निम्नलिखित हैं:

#!/bin/bash

myprog=sleep
echo "This is the wrapper script, it will exec "$myprog""

exec "$myprog" "$@"

जैसा कि ऊपर देखा गया है, वे execनए बनाए गए शेल को लगभग तुरंत बदलने के लिए उपयोग करते हैं $myprog। एक ही बिना हासिल कर सकता है exec:

#!/bin/bash

myprog=sleep
echo "This is the wrapper script, it will exec "$myprog""

"$myprog" "$@"

इस अंतिम उदाहरण में, एक नया बैश इंस्टेंस शुरू किया जाता है और फिर $myprogबैश इंस्टेंस की चाइल्ड प्रोसेस के रूप में शुरू किया जाता है।

पहले दृष्टिकोण के क्या लाभ हैं?


उदाहरण के लिए देखें stackoverflow.com/questions/18351198/…
थॉमस डिके

जवाबों:


31

उपयोग execकरने से आवरण अधिक पारदर्शी हो जाता है, अर्थात यह इस बात की संभावना को कम कर देता है कि स्क्रिप्ट को कॉल करने वाले उपयोगकर्ता या एप्लिकेशन को यह पता होना चाहिए कि यह एक रिले है जो "वास्तविक" प्रोग्राम लॉन्च करता है।

विशेष रूप से, यदि कॉलर प्रोग्राम को मारना चाहता है, तो वे उस प्रक्रिया को मार देंगे जो उन्होंने अभी लॉन्च की थी। यदि रैपर स्क्रिप्ट एक बाल प्रक्रिया चलाता है, तो कॉल करने वाले को यह जानना होगा कि उन्हें रैपर के बच्चे का पता लगाना चाहिए और इसके बजाय उसे मारना चाहिए। रैपर स्क्रिप्ट कुछ संकेतों को रिले करने के लिए एक जाल सेट कर सकती है, लेकिन यह SIGSTOP या SIGKILL के साथ काम नहीं करेगा जिसे पकड़ा नहीं जा सकता है।

कॉल करने से execथोड़ी मेमोरी भी बच जाती है (और अन्य संसाधन जैसे कि पीआईडी ​​आदि) क्योंकि इसमें कुछ भी नहीं करने के लिए अतिरिक्त शेल रखने की आवश्यकता नहीं होती है।

यदि कई आवरण होते हैं, तो समस्याएं बढ़ जाती हैं (मारने की सही प्रक्रिया, मेमोरी ओवरहेड आदि को खोजने में कठिनाई)।

कुछ गोले (जैसे कोर्न शेल) स्वचालित रूप से पता लगाते हैं कि एक कमांड अंतिम है और कोई सक्रिय जाल नहीं है और एक निहित है exec, लेकिन सभी ऐसा नहीं करते हैं (उदाहरण के लिए बाश नहीं)।


10

कोई डुप्लिकेट नहीं मिल रहा है ... FreeBSD हैंडबुक देखें , जो एक अच्छा पर्याप्त कारण देता है:

execबयान निर्दिष्ट कार्यक्रम के साथ खोल प्रक्रिया बदल देता है। यदि execछोड़ दिया जाता है, तो शेल प्रक्रिया मेमोरी में बनी रहती है, जबकि प्रोग्राम निष्पादित हो रहा है, और सिस्टम संसाधनों की अनावश्यक रूप से खपत करता है।

जो अनिवार्य रूप से कारण मुझे काफी पहले समझाया गया था (एक पोर्टर्स द्वारा), और काफी प्रसिद्ध है।

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