কীভাবে ইউনিক্স পরিষেবা পরিবেশের ভেরিয়েবলগুলি দেখতে পাবেন?


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স্ক্রিপ্ট সরাসরি আবেদন করাও সিস্টেমড অপারেটিং সিস্টেমগুলিতে সেই পদ্ধতিটি পরিচালনা করে না, কারণ স্ক্রিপ্টের সমস্ত অনুরোধগুলি systemctlএকটি গোপন হুক দ্বারা অনুরোধে রূপান্তরিত হয় ।
জেডিবিপি

উত্তর:


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আর্গুমেন্ট। >&2স্টারডারে আউটপুট প্রেরণ করুন। এছাড়াও পরিচয় দেখুন ।
মার্ক বেরি

@ মারকবেরি -fএর অংশ [, না if
ক্রিস ডাউন

@ ক্রিসডাউন, ধন্যবাদ সুতরাং " [ ... ]একটি শর্তাধীন জন্য একটি সাঁটে লেখার হয় testকিন্তু দেখ কমান্ড এই উত্তর-fএকটি হয় testযদি একটি ফাইল বিদ্যমান চেক করতে যুক্তি।"
মার্ক বেরি

@ মারকবেরি সঠিক আপনি [(বা test) অন্য একটি কমান্ড হিসাবে ভাবতে পারেন - সমস্ত ifকিছু হ'ল প্রস্থান স্থিতির উপর ভিত্তি করে কিছু পদক্ষেপ নেওয়া।
ক্রিস ডাউন

আমি $VARএটির মতো পরিস্থিতি নিয়ে চলেছি, তবে আমার আরআইপি স্ক্রিপ্টে থাকা দরকার নেই, আমার এটির প্রয়োজন অন্য স্ক্রিনের 2 অথবা 3 কল কল ডাউন স্ট্রিমের কাছে পাওয়া। যেমন। আরআই স্ক্রিপ্ট কল-স্টপ-ডেমন কল করে যা প্রোগ্রাম 1 কল করে (জাভা) যা প্রোগ্রাম 2 কল করে যা প্রয়োজন $VAR। আমি এই উত্তরে কৌতুকটি চেষ্টা করেছিলাম তবে মনে হয় এটি আমার পরিস্থিতিতে কাজ করে না। আমি কীভাবে তা নিশ্চিত করতে পারি যে এটি $VARপ্রোগ্রাম 2 এ উপলব্ধ হবে?
হতাশ

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
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.