অন্যান্য আপস্টার্ট কাজের আগে একটি আপস্টার্ট কাজ শুরু হবে তা আমি কীভাবে নিশ্চিত করতে পারি?


33

এটি একটি সাধারণ আপস্টার্ট প্রশ্ন, তবে আমাকে একটি নির্দিষ্ট কেস ব্যবহার করতে দিন:

অ্যাক্টিভ ডিরেক্টরী গেটওয়ে থেকে সেন্ট্রিফাই একটি এনআইএস। এটি যে কোনও পরিষেবার আগে এটি লোড করা দরকার যা এটি সরবরাহ করে যা প্রমাণীকরণ পরিষেবা নির্ভর করে, যেমন অটোফস, ক্রোন, নিস, এবং অন্যান্য।

এটি অন্যান্য পরিষেবাগুলির নির্ভরতা পরিবর্তন করার চেষ্টা করার পরেও এটি অর্জন করা বেশ চ্যালেঞ্জক বলে প্রমাণিত হয়েছে (যা আমি মনে করি না যে যাইহোক আমাদের করা উচিত, আমি যদি সম্ভব হয় তবে অন্যান্য আপস্টার্ট কাজগুলিকে স্পর্শ করতে চাই না) ।

পরামর্শ?

উত্তর:


29

সমাধানটি অন্য দিক থেকে সমস্যাটির কাছে আসা: সেন্ট্রিফাইয়ের শুরুর মানদণ্ডটি পূরণ করার জন্য, বিদ্যমান পরিষেবাগুলিকে নতুন সেন্ট্রিফাই পরিষেবার উপর নির্ভরশীল করা নয়, বরং নতুন সেন্ট্রিফাই পরিষেবাটি বিদ্যমান পরিষেবাদির উপর নির্ভরশীল করে তোলা দরকার।

উদাহরণস্বরূপ, একটি আপস্টার্ট কনফিগারেশন ফাইল /etc/init/centrify.confবলতে পারে:

শুরু করুন (ক্রোন শুরু করা বা অটোফ শুরু করা বা এনআইএস শুরু করা)

এটিকে ইংরেজী রূপান্তরিত করে, এটি অনুবাদ করবে:

ক্রোন, অটোফস বা নিস স্টার্ট (যেটি প্রথমে শুরু হয়) এর ঠিক আগে সেন্ট্রিফাই পরিষেবা শুরু করুন ।

ক্রোন, অটোফস বা এনআইএস শুরু করার ক্রমটি অপ্রাসঙ্গিক: আপস্টার্ট নিশ্চিত করবে যে কোনও পরিষেবা প্রথম শুরু হওয়ার আগে সেন্ট্রিফাই শুরু হবে, সুতরাং নিশ্চিত হওয়া যায় যে সেগুলির যে কোনও একটি শুরুর আগে সেন্ট্রিফাই চলছে কিনা।

এটিও নোট করুন যে আপস্টার্ট সেন্ট্রিফাই চলমান শুরু না হওয়া অবধি প্রথম পরিষেবাটি শুরু করতে চাইবে।

একবার আপনি এই পদ্ধতিতে চিন্তা করতে অভ্যস্ত হয়ে উঠলে খুব মার্জিত এবং সহজ।


4
এটা আমার পুরোপুরি পিছনে বলে মনে হচ্ছে। যখন অন্য জিনিসগুলি এর উপর নির্ভর করে তখন কেন একটি পরিষেবার জন্য কনফার্ট স্ক্রিপ্ট পরিবর্তন করা উচিত ?
বেন ডাব্লু

3
@ বেনউ যাতে আপনার নিজের মালিকানাধীন পরিষেবাগুলির বিদ্যমান সেটিংসটি পরিবর্তন করতে না হয়।
প্যাকসিসি

1
@ প্যাকসি, আমি যখন এনজিএনএক্সের উপর নির্ভর করে একটি নতুন স্ক্রিপ্ট লিখি তখন আমাকে এনজিঙ্ক্সের জন্য কনফিড স্ক্রিপ্টটি পরিবর্তন করতে হবে ... যা আমার নিজস্ব নয়।
বেন ডব্লিউ

2
@ কেন আপনি start on (started nginx)নতুন স্ক্রিপ্টে ব্যবহার করতে পারবেন না?
প্যাকসিসি

2
@ প্যাকসিসি সত্যই নয় start on (started nginx)এর অর্থ "nginx এর পরে আমার পরিষেবা শুরু করুন" যা "আমার পরিষেবার আগে এনগিনেক্স শুরু করার মতো নয় কারণ এটির প্রয়োজন এটি।"
সিলিল

12

জেমসের উত্তর 1 থেকে 1 নির্ভরতার জন্য কাজ করে। এক থেকে অনেকের জন্য, অর্থাত্ বি, সি, এবং ডি পরিষেবাগুলির আগে পরিষেবা শুরু হয় এটিকে নিশ্চিত করার জন্য, আপনাকে অন্য একটি পদ্ধতি গ্রহণ করতে হবে। আপনি রেফারেন্সের জন্য বর্তমান পোর্টম্যাপ স্ক্রিপ্টগুলি দেখতে পারেন তবে এখানে সাধারণ পদ্ধতিটি রয়েছে: একটি অপেক্ষা স্ক্রিপ্ট তৈরি করুন।

পরিস্থিতি: আপনি চান আপনার পরিষেবা এ সর্বদা পরিষেবা-বি, পরিষেবা-সি, এবং পরিষেবা-ডি এর আগে চলুক।

সমাধান: পরিষেবা এ এর ​​জন্য একটি অপেক্ষা স্ক্রিপ্ট তৈরি করুন "এটিকে কল করুন" /etc/init/service-a-wait.conf "

# service-a-wait

start on (starting service-b 
    or starting service-c
    or starting service-d)
stop on (started service-a or stopped service-a)

# We know that we have more than one job that needs to wait for service-a and
# will make use of this service, so we need to instantiate.
instance $JOB

# Needed to make starting the job successful despite being killed
normal exit 2
task

script

    status service-a | grep -q "start/running" && exit 0
    start service-a || true

    # Waiting forever is ok.. upstart will kill this job when
    # the service-a we tried to start above either starts or stops
    while sleep 3600 ; do :; done

end script

সরল ইংরেজিতে এর অর্থ কী: পরিষেবা বি, সি, বা ডি সংকেত যখন তারা শুরু করতে চায়, পরিষেবা-ক চলমান অবধি তাদের শুরু করতে অপেক্ষা করতে হবে। পরিষেবা-অপেক্ষার কাজটি সার্ভিস-এ শুরু না হওয়া অবধি চালনার জন্য ডিজাইন করা হয়েছে। একবার পরিষেবা-অপেক্ষার প্রস্থান বন্ধ হয়ে যায়, এখন পরিষেবাদি খ, সি, এবং ডি চালিয়ে যাওয়া এবং চালানোর জন্য বিনামূল্যে are

এর দ্বারা বিপরীত নির্ভরতাগুলির কোনও শুরু করার চেষ্টা করার আগে এটি পরিষেবা-এ প্রস্তুত এবং চলমান হওয়ার বিষয়টি নিশ্চিত করবে।

দ্রষ্টব্য: এই "শুরু করুন ... বা .. বা .." দৃশ্যে "উদাহরণ instance জওবি" লাইনটি গুরুত্বপূর্ণ। অন্যথায় আপনি কেবল বি, সি, বা ডি এর যে কোনওটিকে প্রথমে আগুন জ্বালিয়ে ব্লক করবেন।

(তাত্ক্ষণিকতা সততার সাথে আরও ভাল ব্যাখ্যা পাওয়ার যোগ্য now এখনকার জন্য, কেবল এটি করুন;)


3
আমি এটি পাই না ... পরিষেবা এ এবং পরিষেবা বি শুরু করা অব্যাহত রাখার মধ্যে কোন রেসের শর্তকে বাধা দেয়? আমি দেখতে পাচ্ছি না যে কীভাবে আপস্টার্ট জানবে যে স্ক্রিপ্টটি "স্টার্ট সার্ভিস-এ" সম্পন্ন হয়েছে ... (এটি আপস্টার্টের
জঘন্য

@ মার্ক রাসেল: normal exit 2তার normal exit 0 2পরিবর্তে সেই লাইনটি হওয়া উচিত নয় ? scriptবিভাগে প্রথম লাইনটি বেশ স্পষ্টভাবে করতে পারে exit 0
ফলজ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.