সিস্টেমযুক্ত পুনঃসূচনা = সর্বদা সম্মানিত হয় না


53

দ্রষ্টব্য: আমি মিডিয়ামের উপরে একটি নিবন্ধ লিখেছিলাম যাতে কীভাবে একটি পরিষেবা তৈরি করা যায় এবং এই বিশেষ সমস্যাটি কীভাবে এড়ানো যায় সে সম্পর্কে ব্যাখ্যা করা হয়েছে: সিস্টেমেড সহ একটি লিনাক্স পরিষেবা তৈরি করা

মূল প্রশ্ন:


আমি কর্মী স্ক্রিপ্ট সর্বদা কাজ করে রাখতে সিস্টেমড ব্যবহার করছি:

[Unit]
Description=My worker
After=mysqld.service

[Service]
Type=simple
Restart=always
ExecStart=/path/to/script

[Install]
WantedBy=multi-user.target

যদিও স্ক্রিন্টটি কয়েক মিনিটের পরে স্বাভাবিকভাবে প্রস্থান হয়ে গেলে পুনরায় সূচনাটি systemdঠিকঠাক কাজ করে , আমি লক্ষ্য করেছি যে এটি যদি বারবার স্টার্টআপে চালাতে ব্যর্থ হয় তবে এটি শুরু করার চেষ্টাটি ছেড়ে দেবে:

Jun 14 11:10:31 localhost systemd[1]: test.service: Main process exited, code=exited, status=1/FAILURE
Jun 14 11:10:31 localhost systemd[1]: test.service: Unit entered failed state.
Jun 14 11:10:31 localhost systemd[1]: test.service: Failed with result 'exit-code'.
Jun 14 11:10:31 localhost systemd[1]: test.service: Service hold-off time over, scheduling restart.
Jun 14 11:10:31 localhost systemd[1]: test.service: Start request repeated too quickly.
Jun 14 11:10:31 localhost systemd[1]: Failed to start My worker.
Jun 14 11:10:31 localhost systemd[1]: test.service: Unit entered failed state.
Jun 14 11:10:31 localhost systemd[1]: test.service: Failed with result 'start-limit'.

একইভাবে, আমার কর্মী স্ক্রিপ্ট একজন প্রস্থান অবস্থা সঙ্গে বেশ কয়েকবার বিফল হয় 255, systemdএটিকে পুনর্সূচনা করার প্রচেষ্টা বাদ দেয়:

Jun 14 11:25:51 localhost systemd[1]: test.service: Failed with result 'exit-code'.  
Jun 14 11:25:51 localhost systemd[1]: test.service: Service hold-off time over, scheduling restart.  
Jun 14 11:25:51 localhost systemd[1]: test.service: Start request repeated too quickly.  
Jun 14 11:25:51 localhost systemd[1]: Failed to start My worker.  
Jun 14 11:25:51 localhost systemd[1]: test.service: Unit entered failed state.  
Jun 14 11:25:51 localhost systemd[1]: test.service: Failed with result 'start-limit'.

সর্বদা কয়েক সেকেন্ড পরে আবার চেষ্টা systemdকরার জন্য কি কোনও উপায় আছে ?

উত্তর:


53

আমি রাহুলের উত্তরটি কিছুটা বাড়িয়ে দিতে চাই।

সিস্টেমডি একাধিকবার ( StartLimitBurst) পুনরায় চালু করার চেষ্টা করে এবং চেষ্টা গণনার মধ্যে পৌঁছে গেলে চেষ্টা করা বন্ধ করে দেয় StartLimitIntervalSec। উভয় বিকল্প [unit]বিভাগের অন্তর্গত ।

মৃত্যুদণ্ড কার্যকর করার মধ্যে ডিফল্ট বিলম্বটি 100 মিমি ( RestartSec) যার কারণে হারের সীমা খুব দ্রুত পৌঁছে যায়।

রিস্টার্ট নীতি সংজ্ঞায়িত ইউনিটগুলির জন্য সিস্টেমডি আর কোনও স্বয়ংক্রিয় পুনরায় আরম্ভের চেষ্টা করবে না :

নোট করুন যে ইউনিটগুলির জন্য কনফিগার করা হয়েছে Restart=এবং যা প্রারম্ভিক সীমাতে পৌঁছেছে তাদের আর পুনরায় আরম্ভ করার চেষ্টা করা হবে না; তবে এগুলি পরবর্তী সময়ে পুনরায় আরম্ভ করা যেতে পারে, যে বিন্দু থেকে পুনরায় সূচনা যুক্তিটি আবার সক্রিয় করা হবে।

রাহুলের উত্তর সাহায্য করে, কারণ বেশি দেরি StartLimitIntervalSecসময়ের মধ্যে ত্রুটি কাউন্টারে পৌঁছাতে বাধা দেয় । সঠিক উত্তর হ'ল উভয়ই সেট করা RestartSecএবং StartLimitBurstযুক্তিসঙ্গত মানগুলি।


5
কিছু পরীক্ষা-ত্রুটির পরে আমি (শেষ পর্যন্ত) এটি কীভাবে কাজ করে তা বুঝতে পেরেছি, আমি দেখতে পারি যে আপনার উত্তরটি সবচেয়ে সঠিক। আমার জন্য নীচে লাইন: সেট StartLimitIntervalSec=0এবং voilà।
বেনিয়ামিন

34

হ্যাঁ , আছে। আপনি বিভাগের xঅধীনে কয়েক সেকেন্ড পরে পুনরায় চেষ্টা করতে নির্দিষ্ট করতে পারেন [Service],

[Service]
Type=simple
Restart=always
RestartSec=3
ExecStart=/path/to/script

ফাইলটি সংরক্ষণের পরে আপনাকে systemdনতুন ফাইল সম্পর্কে সচেতন হওয়ার জন্য ডিমন কনফিগারেশনগুলি পুনরায় লোড করতে হবে,

systemctl daemon-reload

তারপরে পরিবর্তনগুলি সক্ষম করতে পরিষেবাটি পুনরায় চালু করুন,

systemctl restart test

আপনি যেমন অনুরোধ করেছেন, ডকুমেন্টেশনটি দেখে,

Restart=on-failure

শালীন সুপারিশ মত শোনাচ্ছে।


এটা সত্যিই কাজ বলে মনে হচ্ছে, আপনাকে ধন্যবাদ! সুতরাং এটি আরও ভালভাবে বোঝার জন্য, RestartSecনির্দেশ ছাড়াই , systemdবেশ কয়েকটি পুনরায় আরম্ভ করার চেষ্টা করে খুব দ্রুত, তারপরে স্থায়ী ব্যর্থতার রাজ্যে প্রবেশ করে; নির্দিষ্ট কিছু যখন ঘটতে পারে নাRestartSec ?
বেনিয়ামিন

এছাড়াও, আমি লক্ষ্য করেছি যে এটি আমার শ্রমিকের "স্বাভাবিক" পুনরায় আরম্ভ করতে বিলম্ব করে (আমি উদ্দেশ্যমূলকভাবে কয়েক মিনিটের পরে কর্মীকে স্রষ্টার সাথে বের করে দিচ্ছি); ব্যর্থ পুনরায় আরম্ভ করতে কেবল বিলম্ব করার উপায় কি আছে ?
বেনিয়ামিন

@ বেঞ্জামিন আমার আপডেটগুলি দেখুন
রাহুল

@ বেঞ্জামিন আপনি আরও পরামিতিগুলির জন্য এখানে চেক করতে পারেন ।
রাহুল

3
দস্তাবেজের দ্বারা বিচার করা , alwaysএটি একটি সুপারস্টার on-failure, সুতরাং এটি সাহায্য করবে না!
বেনিয়ামিন

4

systemd এটি পুনরায় চালু করার চেষ্টা ছেড়ে দেয়

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

14 ই জুন 11:25:51 লোকালহোস্ট সিস্টেমডড [1]: test.service: ফলাফল 'প্রারম্ভিক-সীমাবদ্ধতা' দিয়ে ব্যর্থ হয়েছে

এটি লাথি মেরে সীমাবদ্ধ করা।

অল্প সময়ের দৈর্ঘ্যটি StartLimitIntervalSec=সেটিংটি ব্যবহার করে পরিষেবা ইউনিটে নির্দিষ্ট করা হয়েছে । হার সীমাবদ্ধকরণ প্রক্রিয়াটি ট্রিগার করতে সেই ব্যবধানের মধ্যে যে শুরুর প্রয়োজনীয়তা StartLimitBurst=সেটিংসের মাধ্যমে সুনির্দিষ্ট করা হয় । যদি আপনার সিস্টেমে কোনও কিছুই এই দুটি সেটিংসের ডিফল্ট সহ ভ্যানিলা সিস্টেমযুক্ত থেকে আলাদা না হয়, তবে এটি 10 ​​সেকেন্ডের মধ্যে 5 বার।

StartLimitIntervalSec=0হার সীমাবদ্ধকরণ অক্ষম করে। তবে আপনার পরিষেবাটি হয় প্রায়শই প্রস্থান না করা, এবং প্রস্থান এবং পুনরায় আর্টের মধ্যে যথেষ্ট নিষ্ক্রিয় হওয়া যে এটি সীমাবদ্ধ প্রান্তিকের চেয়ে বেশি নয়, এটি একটি ভাল পদ্ধতির।

নোট করুন যে হারকে সীমাবদ্ধ করা আপনার পরিষেবাটি কীভাবে বেরিয়েছে তা বিবেচ্য নয়। এটি তার কারণ নির্বিশেষে এটিকে শুরু / পুনঃসূচনা করার প্রচেষ্টার সংখ্যার উপর ট্রিগার করে।

আরও পড়া


5
এটি স্থায়ীভাবে ছেড়ে দেবে বলে মনে হচ্ছে, যদিও: "অ্যাক্টিভ: ব্যর্থ (ফলাফল: শুরু-সীমা) বুধ ২০১ Wed-০-15-15 থেকে 01:21:24 সিইএসটি; 12 ঘন্টা আগে" " এটি এই অবস্থায় থাকে এবং স্ক্রিপ্টটি আর কখনও চালানো হয় না। আমি ম্যানুয়ালি সেট করার চেষ্টা করেছি StartLimitIntervalSec=10এবং StartLimitIntervalSec=5কোনও ভাগ্য নেই।
বেনিয়ামিন

4
এটি ডিফল্টভাবে স্থায়ীভাবে ছেড়ে দেয় give Github.com / সিস্টেমেড / সিস্টেমেড/issues/2416 দেখুন ।
আদম গুডে

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