কীভাবে এই ভেরিয়েবলের পলায়ন একটি সিস্টেমড ইউনিট ফাইলে কাজ করে?


9

আমি সার্ভারের উদাহরণগুলির জন্য আবিষ্কারের সাইডকিক পরিষেবাটির জন্য আমার কাছে মোটামুটি সহজ ইউনিট ফাইল রয়েছে যা আমি কোরিওএস এ চলেছি। ইউনিট ফাইলটি দেখতে এমন দেখাচ্ছে:

[Unit]
Description=Discovery for frontend server (instance %i)
BindsTo=frontend@%i.service
After=frontend@%i.service

[Service]
EnvironmentFile=/etc/environment
ExecStart=/usr/bin/bash -c ' \
    while true; do \
        export PORT=$(docker port frontend%i 80 | sed s/.*://); \
        etcdctl set /services/frontend/%i "${COREOS_PRIVATE_IPV4}:$PORT" --ttl 60; \
        sleep 45; \
    done'
ExecStop=/usr/bin/etcdctl rm /services/frontend/%i

[X-Fleet]
MachineOf=frontend@%i.service

এটি সূক্ষ্মভাবে কাজ করে, তবে এই পর্যায়ে পৌঁছতে আমার বয়স কয়েক হয়েছে, কারণ যদি আমি etcdctlলাইনটি এখানে পরিবর্তন করি :

etcdctl set /services/frontend/%i "${COREOS_PRIVATE_IPV4}:${PORT}" --ttl 60; \

তারপরে এটি কার্যকর হয় না - এটি 100.45.218.3:কোনও পোর্ট ছাড়াই একটি মান সেট করে শেষ করে । চলার পথে আমি $PORTভেরিয়েবলের বিভিন্ন ব্যবহারের সাথে খেলতে অনেক সময় ব্যয় করেছি এবং কনফিগারেশনটি কেন কাজ করে তা আমার কোনও ধারণা নেই। এক পর্যায়ে আমার এটি স্ক্রিপ্টে ছিল:

echo hi $PORT; \
echo "hi $PORT"; \
echo hi ${PORT}; \
echo "hi ${PORT}"; \

এবং জার্নাল লগগুলি এর মতো পেয়েছে:

Aug 17 01:05:07 core-01 bash[53694]: hi 32769
Aug 17 01:05:07 core-01 bash[53694]: hi 32769
Aug 17 01:05:07 core-01 bash[53694]: hi
Aug 17 01:05:07 core-01 bash[53694]: hi

মূলত আমার প্রশ্ন: এখানে কি চলছে? আমি কীভাবে {}বাশ স্ক্রিপ্টগুলিতে কাজ করতে বুঝতে পারি তার মুখে এটি উড়ে যায় । এবং কেন আমি COREOS_PRIVATE_IPV4ভেরিয়েবলের উপর কার্লিগুলি ব্যবহার করতে পারি (যা থেকে রফতানি হয় /etc/environmentতবে এর জন্য নয়) PORT?

উত্তর:


9

এটি systemd.service (1) এ নথিভুক্ত করা হয়েছে । ${PORT}সিস্টেমযুক্ত দ্বারা প্রসারিত হয়। $শেলটি পাস করার জন্য আপনাকে লিখতে হবে $$, তাই $${PORT}। গুরুত্বপূর্ণ লাইনটি হ'ল:

আক্ষরিক ডলার সাইন পাস করতে, "$$" ব্যবহার করুন। ভেরিয়েবলগুলি যার মান সম্প্রসারণের সময় জানা যায় না তাদের খালি স্ট্রিং হিসাবে গণ্য করা হয়।


তার জন্য ধন্যবাদ! এটি এখন উপলব্ধি করেছে, আমি খেয়াল করিনি যে স্ক্রিপ্ট নিজেই প্রয়োগ করার সময় সিস্টেমের দ্বারা পরিবর্তনশীলগুলি পরিবর্তিত হতে পারে ...
ড্যানিয়েল বাকমাস্টার

1
  1. পোর্টটির বিষয়বস্তু যদি অন্য কোনও ব্যাশ ভেরিয়েবল থেকে আসে indirect referenceতবে আপনি তার সাথে লেনদেন করবেন তবে দয়া করে চেষ্টা করুন:

    ${!PORT}
  2. আমি ধরে নিলাম আপনি নিশ্চিত যে আপনার শেল বাশ


উত্তরের জন্য ধন্যবাদ! 1. PORTস্ক্রিপ্টের একটি লাইন থেকে আসে export PORT=$(docker ...); 2. ব্যাশ 4.2 সহ কোরিয়াস জাহাজ
ড্যানিয়েল

আপনি কি ${!PORT}আপনার স্ক্রিপ্টে চেষ্টা করেছেন ??
পট

আমি করেছি, এবং মনে হচ্ছে এটি একই ফলাফল দেয় (একটি খালি স্ট্রিং)।
ড্যানিয়েল বাকমাস্টার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.