स्क्रिप्ट के माध्यम से बूट पर वैश्विक पर्यावरण चर कैसे सेट करें, और क्या उन्हें लॉगिन से पहले चलने वाले एप्लिकेशन के लिए उपलब्ध है?


17

मेरे पास एक सेवा है जो बूट पर चलती है, और उस सेवा में यह पृष्ठभूमि में एक बैश स्क्रिप्ट कहती है जो कुछ पर्यावरण चर का निर्यात करती है। मेरे पास समस्या यह है कि उन पर्यावरण चर को पृष्ठभूमि प्रक्रिया के माता-पिता को नहीं भेजा जा रहा है, जैसे ही मेरी स्क्रिप्ट निष्पादित हो रही है, वे चले गए हैं।

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

आरएचईएल प्रणाली मैं इसे चलाता हूं इसका मतलब उपयोगकर्ता द्वारा कभी लॉग-इन नहीं किया जाना है, यह केवल बूट करता है और एप्लिकेशन शुरू करता है। मुझे पता है कि एक मूल प्रक्रिया / शेल के लिए पर्यावरण चर वास्तव में एक बाल पृष्ठभूमि प्रक्रिया शेल द्वारा निर्धारित नहीं किया जा सकता है।

मुझे एक स्क्रिप्ट के माध्यम से ऐसा करने की ज़रूरत है, जो मेरी सेवा द्वारा बुलाया जाता है (जरूरी नहीं कि पृष्ठभूमि में जरूरी हो), न कि उन्हें मेरी सेवा में जोड़कर (जो मेरे लिए या तो काम नहीं किया) और न कि उन्हें स्टोर करके /etc/environment या .profileया ऐसा कुछ भी।

अपनी सेवा में मैंने पर्यावरण चर को जोड़ने की कोशिश की (हालांकि मैं जो करना चाहता हूं):

    export TEST=192.168.1.1

मैंने भी अपनी सेवा में यह कोशिश की:

    TEST=192.168.1.1
    export TEST=${TEST}

मैंने बदलने की कोशिश की कि मेरी सेवा कैसे बैश स्क्रिप्ट को कॉल करती है:

    /bin/asdf/script &

मैं भी स्क्रिप्ट सोर्सिंग करने की कोशिश की है ताकि यह एक ही खोल (जो मैं से मिला में चलता है इस ):

    . ./bin/asdf/script
    #I'm very confused why this didn't work

मैंने यह भी पाया इस जो दिलचस्प देखा लेकिन यह वास्तव में मेरे मामले में थकना नहीं किया।

जवाबों:


12

आप चर को इकट्ठा करने के लिए स्क्रिप्ट डालने का प्रयास कर सकते हैं /etc/profile.d/

उदाहरण:

/etc/profile.d/somescript.sh

#!/bin/bash
TEST=$(cat /var/somefile)
export $TEST

/etc/profileएक कॉल करता है जो किसी भी स्क्रिप्ट को चलाएगा /etc/profile.d/, और यह रूट सहित सिस्टम पर सभी उपयोगकर्ताओं पर लागू होता है।


आप यहाँ कुछ करने के लिए हो सकता है। मैं वास्तव में ऐसा नहीं करना चाहता, हालांकि स्क्रिप्ट IA कारणों के लिए / etc निर्देशिका में स्थित नहीं हो सकती। लेकिन मुझे लगता है कि मैं वहाँ एक स्क्रिप्ट बना सकता हूं जो मेरी स्क्रिप्ट की ओर इशारा करता है। लेकिन चीजों को जटिल करने के लिए, स्क्रिप्ट द्वारा सेट किए गए कुछ पर्यावरण चर सेवा द्वारा निर्धारित पर्यावरण चर से आ रहे हैं। इसलिए यह काम नहीं कर सकता है, क्योंकि सेवा स्क्रिप्ट के अंत में आने से पहले ही चर सेट करना होता है, लेकिन बहुत जल्दी या आवश्यक नहीं कि पर्यावरण चर अभी तक सेवा द्वारा नहीं बनाए गए हैं।
sqenixs 2

मुझे लगता है कि मैं सेवा में निर्धारित चर पर निर्भरता से छुटकारा पा सकता हूं। इस मामले में, मुझे लगता है कि यह काम करेगा, जब तक सेवा शुरू होने से पहले स्क्रिप्ट चलती है। क्या आप जानते हैं कि लॉगिन शेल कब शुरू किया जाता है? या लॉगिन शेल शुरू होने पर क्या मैं नियंत्रित कर सकता हूं? मेरे पास अपने रन स्तर के लिए rcX.d निर्देशिका में इसके लिए कोई सेवा नहीं है।
sqenixs

1

एक प्रक्रिया के लिए किसी अन्य मौजूदा प्रक्रिया के वातावरण को प्रभावित करने का कोई तरीका नहीं है। प्रक्रियाएं केवल उनके बच्चे की प्रक्रियाओं के वातावरण को प्रभावित करती हैं।

इसलिए आपको इन पर्यावरण चर को उस एप्लिकेशन के पूर्वज में सेट करना होगा जो उनकी आवश्यकता है। अपनी सेवा को अलग-अलग करने के बजाय पर्यावरण-सेटिंग बैश स्क्रिप्ट और एप्लिकेशन को इनवॉइस करें, आपकी सेवा ने एक बैश स्क्रिप्ट को लागू किया है जो पर्यावरण चर को सेट करता है और फिर एप्लिकेशन लॉन्च करता है।

#!/bin/bash
. /path/to/environment/variable/setter.bash
exec /path/to/application

हालांकि मैंने जो ऑनलाइन पढ़ा है, उसमें हैक (कुछ करने के लिए एक स्रोत स्क्रिप्ट पर eval के साथ क्या करना है, या gdb का उपयोग करके) हालांकि इसे काम करना है। मैं पृष्ठभूमि में होने के नाते इसके बारे में अधिक दिलचस्पी नहीं रखता हूं, अगर मैं वर्तमान "शेल" में कमांड चला सकता हूं (क्या आप बूट के दौरान एक शेल में हैं जब आपकी सेवा निष्पादित हो रही है?) तो वह भी ठीक होगा।
sqenixs

दुर्भाग्य से, मैं सेवा से आवेदन शुरू नहीं कर सकता, क्योंकि कई अलग-अलग प्रक्रियाएं हैं जो शुरू होती हैं और जिन चीजों को एप्लिकेशन प्रारंभ स्क्रिप्ट से कॉन्फ़िगर किया गया है, और उन्हें IA के लिए सेवा से अलग रखा जाना चाहिए।
sqenixs

@sqenixs एक शेल किसी अन्य की तरह एक प्रक्रिया है। "शेल में होना" जैसी कोई चीज नहीं है। जब आप "एक स्रोत स्क्रिप्ट को विकसित करने" की बात करते हैं, तो यह एक प्रोटोकॉल है जहां एक प्रोग्राम (जो शेल स्क्रिप्ट नहीं हो सकता है) शेल सिंटैक्स में परिभाषाओं को प्रिंट करता है, और एक शेल स्क्रिप्ट उनकी व्याख्या करता है। जीडीबी के साथ पर्यावरण चर सेट करना काम कर सकता है, या इसका कोई प्रभाव नहीं हो सकता है, या यह आपके एप्लिकेशन को क्रैश कर सकता है; जैसा कि आप कल्पना कर सकते हैं, उत्पादन में डिबगर का उपयोग करने की अनुशंसा नहीं की जाती है (और, फिर से, अच्छे कारण के लिए)।
गिल्स एसओ- बुराई को रोकना '

संभवतः आपकी समस्या का समाधान है, लेकिन आपको अपनी आवश्यकताओं के साथ अधिक सटीक होना चाहिए। अपने प्रश्न में, आप लिखते हैं "स्क्रिप्ट चलाने के बाद सेवा फिर किसी अन्य स्क्रिप्ट को कॉल करती है जो अनुप्रयोग शुरू करता है"। तो आपको लगता है कि एक समाधान है: उस अन्य स्क्रिप्ट के अंदर पर्यावरण चर सेट करें। लेकिन फिर एक टिप्पणी में आप लिखते हैं कि आप "सेवा से आवेदन शुरू नहीं कर सकते हैं"। तो, यह कौन सा है?
गिल्स एसओ- बुराई को रोकना '

शायद, बूट समय पर / sbin / init के वातावरण को बनाते या कॉन्फ़िगर करते हैं। चूंकि हर प्रक्रिया init वैसे भी एक बच्चे की है, इसलिए चाइल्ड प्रोसेस पर्यावरण का अधिग्रहण कर सकती है। बस एक विचार / अनुमान।
निखिल मुल्ले
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.