यूनिक्स सेवा को पर्यावरण चर कैसे देखें?


52

मैंने अपने पर्यावरण चर का उपयोग करके सेट किया है /etc/profile:

export VAR=/home/userhome

फिर अगर मैं echo $VARइसे दिखाता हूं/home/userhome

लेकिन जब मैं /etc/init.d/servicenameफ़ाइल में इस चर का संदर्भ देता हूं , तो यह चर नहीं पा सकता है। जब मैं निम्नलिखित सामग्री वाली फ़ाइल service servicename statusका उपयोग करके दौड़ता हूं /etc/init.d/servicename:

case "$1" in
status)    
    cd $VAR/dir
    ;;
esac

इसे कहते हैं /dir: No such file or directory

लेकिन यह काम करता है अगर मैं /etc/init.d/servicename statusइसके बजाय चलाता हूंservice servicename status

मैं यूनिक्स सेवा को पर्यावरण चर कैसे देख सकता हूं?


ध्यान दें कि प्रणाली 5 लागू rcस्क्रिप्ट सीधे भी , systemd ऑपरेटिंग सिस्टम पर उस तरह से काम नहीं करता है के रूप में स्क्रिप्ट के सभी आमंत्रण का आमंत्रण में बदल जाता है systemctlएक छिपे हुए हुक से।
JdeBP

जवाबों:


70

समस्या serviceसभी पर्यावरण चर है TERM, लेकिन , PATHऔर LANGजो एक अच्छी बात है। यदि आप स्क्रिप्ट को सीधे निष्पादित कर रहे हैं तो पर्यावरण चर को हटा नहीं सकता है इसलिए सब कुछ काम करता है।

आप बाहरी पर्यावरण चर पर भरोसा नहीं करना चाहते क्योंकि स्टार्टअप पर पर्यावरण चर शायद मौजूद नहीं है और आपका init सिस्टम शायद इसे वैसे भी सेट नहीं करेगा।

यदि आप अभी भी इस तरह के चर पर भरोसा करना चाहते हैं, तो एक फ़ाइल का स्रोत और उसमें से चर पढ़ें, जैसे /etc/default/servicenameसामग्री के साथ बनाएं :

VAR=value

और अपने init स्क्रिप्ट से स्रोत, जैसे:

[ -f /etc/default/service-name ] && . /etc/default/service-name

if [ -z "$VAR" ] ;  then
  echo "VAR is not set, please set it in /etc/default/service-name" >&2
  exit 1
fi

case "$1" in
status)    
    cd "$VAR"/dir
    ;;
esac

13
बहुत मददगार, धन्यवाद। अन्य लिनक्स न्यूबॉकों के लिए, यहाँ क्रिप्टिक बैश सामान है। [ ... ]एक सशर्त परीक्षण के लिए एक आशुलिपि है; इस उत्तर को देखें । फ़ाइल मौजूद है या नहीं यह जाँचने के लिए -fएक ifतर्क है। &&एक शॉर्ट-सर्किट ऑपरेटर है: केवल दूसरा कमांड करते हैं यदि पहला 0. .स्रोत या डॉट ऑपरेटर के साथ बाहर निकलता है : फ़ाइल नाम तर्क से आदेशों को पढ़ें और निष्पादित करें। -zएक है ifएक शून्य लंबाई स्ट्रिंग के लिए जाँच करने के लिए तर्क। >&2Stderr को आउटपुट भेजें। यह भी देखें यदि का परिचय
मार्क बेरी

@ मार्केबरी -fका हिस्सा है [, नहीं if
क्रिस डाउन

@ क्रिसडाउन, धन्यवाद। तो " [ ... ]सशर्त testआदेश के लिए एक आशुलिपि है ; इस जवाब को देखें । एक फ़ाइल मौजूद है या नहीं यह जांचने के लिए -fएक testतर्क है।"
मार्क बेरी

@ मार्केबरी सही। आप सिर्फ एक और कमांड के रूप में [(या test) के बारे में सोच सकते हैं - सभी ifबाहर निकलने की स्थिति के आधार पर कुछ कार्रवाई करते हैं।
क्रिस डाउन

मैं इस तरह की स्थिति में चला गया हूं, लेकिन मुझे $VARinit स्क्रिप्ट में रहने की आवश्यकता नहीं है , मुझे इसकी आवश्यकता एक अलग प्रोग्राम 2 या 3 कॉल करने के लिए उपलब्ध होना चाहिए , जो init स्क्रिप्ट के डाउनस्ट्रीम है। उदाहरण के लिए। init स्क्रिप्ट स्टार्ट-स्टॉप-डेमॉन को कॉल करता है जो प्रोग्राम 1 (जावा) को कॉल करता है जिसे प्रोग्राम 2 की आवश्यकता होती है $VAR। मैंने इस उत्तर में चाल की कोशिश की, लेकिन यह मेरी स्थिति में काम नहीं करता है। मैं यह कैसे सुनिश्चित कर सकता हूं कि $VARप्रोग्राम 2 के लिए उपलब्ध होगा?
FrustratedWithFormsDesigner

1

मेरे मामले में, मैं एक की जरूरत RAILS_ENVहै कि में स्थापित किया गया था /etc/bash.bashrc: export RAILS_ENV=staging। मैंने जोड़ा $(grep RAILS_ENV /etc/bash.bashrc)और उस चर को स्क्रिप्ट में उपलब्ध कराया। मैंने इसे इस तरह से किया इसलिए मुझे बाकी फाइल को शामिल नहीं करना पड़ा।


-1

एक बदसूरत समाधान जो भी काम करेगा:

function exec() {
    args=( $@ )
    command=${args[0]}
    dummy=${args[1]}
    whoami=`whoami`
    if [ -z "$dummy" ]; then
        me=`basename $0`
        runuser -l ${whoami} -c "bash /etc/init.d/${me} ${command} dummy"
    else
       printenv
   fi
}

case $1 in
    status)
        status
        ;;
    start|stop|kill|restart)
        exec $*
        ;;
    *)
        usage
esac
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.