সিগ্কিলের মাধ্যমে শেষ করতে বাগী সিস্টেমড পরিষেবাটি কনফিগার করুন


20

পটভূমি

আমাকে systemdএকটি নতুন পরিষেবার জন্য একটি স্ক্রিপ্ট তৈরি করতে বলা হয়েছে foo_daemon, যা কখনও কখনও "খারাপ অবস্থার" হয়ে যায় এবং এর মাধ্যমে মারা যাবে না SIGTERM(সম্ভবত কাস্টম সিগন্যাল হ্যান্ডলারের কারণে)। এটি বিকাশকারীদের জন্য সমস্যাযুক্ত, কারণ তাদের মাধ্যমে পরিষেবাটি শুরু / বন্ধ / পুনরায় চালু করার নির্দেশ দেওয়া হয়েছে:

  • systemctl start foo_daemon.service
  • systemctl stop foo_daemon.service
  • systemctl restart foo_daemon.service

সমস্যা

কখনও কখনও foo_daemonখারাপ অবস্থার মধ্যে পড়ার কারণে আমাদের এটিকে জোর করে হত্যা করতে হয়:

  • systemctl kill -s KILL foo_daemon.service

প্রশ্ন

আমি কীভাবে আমার systemdস্ক্রিপ্টটি সেটআপ করতে পারি foo_daemon, যখনই কোনও ব্যবহারকারী পরিষেবাটি বন্ধ / পুনঃসূচনা করার চেষ্টা করে, তা systemdকরবে:

  • এর foo_daemonমাধ্যমে একটি দৃষ্টিনন্দন শাটডাউন চেষ্টা করুন SIGTERM
  • foo_daemonসম্পূর্ণ করার জন্য শাটডাউন / সমাপ্তির জন্য 2 সেকেন্ড পর্যন্ত সময় দিন ।
  • প্রক্রিয়াটি এখনও বেঁচে থাকলে তার foo_daemonমাধ্যমে জোর করে শাটডাউন করার চেষ্টা করুন SIGKILL(সুতরাং আমাদের পিআইডি পুনর্ব্যবহারের ঝুঁকি নেই এবং ভুল পিআইডির বিরুদ্ধে systemdসমস্যা রয়েছে SIGKILL)। আমরা যে ডিভাইসটি পরীক্ষা করছি তার ফলে অসংখ্য প্রক্রিয়া দ্রুত ছড়িয়ে পড়ে / কাঁটাচামচ হয়, তাই পিআইডি পুনর্ব্যবহারের একটি সমস্যা দেখা দেওয়ার বিষয়ে একটি বিরল তবে খুব বাস্তব উদ্বেগ রয়েছে।
  • যদি, বাস্তবে, আমি পিআইডি পুনর্ব্যবহারযোগ্য সম্পর্কে SIGKILLব্যর্থ হচ্ছি, তবে আমি স্ক্রিপ্টটি ঠিক করছি প্রক্রিয়াটির বিরুদ্ধে 'পিআইডি পুনর্ব্যবহারযোগ্য পিআইডি হত্যার বিষয়ে উদ্বিগ্ন না হয়ে iss


2
এমনকি আপনি যদি দুই সেকেন্ডের মধ্যে 4 মিলিয়ন PIDs উপর ডিম প্রসেস রোলে দ্রুত যথেষ্ট, systemd হল না একটি লুপ পরীক্ষণ বসতে "এই PID বেঁচে আছেন এখনো? এই PID এখনও জীবিত?" কারণ এর দরকার নেই; এটির তাত্ক্ষণিক শিশু প্রক্রিয়াগুলি এখনও বেঁচে আছে কি না তা সম্পর্কে ইতিমধ্যে অবহিত করা হয়েছে (সাধারণ এসএইচসিএলডি এবং ওয়েটপিডের মাধ্যমে))) সুতরাং যদি এটি দেখায় যে প্রক্রিয়াটি সাইনটার্মের পরেও বিদ্যমান রয়েছে, তবে এটি কেবল পরিষেবাটিকে 'নিষ্ক্রিয়' হিসাবে চিহ্নিত করবে - এটি চেকিং, অপেক্ষা এবং সিগ্কেল প্রেরণে মোটেই বিরক্ত করবে না।
মাধ্যাকর্ষণ

উত্তর:


26

সিস্টেমড ইতিমধ্যে বাক্সের বাইরে এটি সমর্থন করে এবং এটি ডিফল্টরূপে সক্ষম হয়

কেবলমাত্র আপনি কাস্টমাইজ করতে চাইতে পারেন সময়সীমা, যা আপনি করতে পারেন TimeoutStopSec=। উদাহরণ স্বরূপ:

[Service]
TimeoutStopSec=2

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

যদি আপনার পরিষেবাটি সিস্টেম-সচেতন না হয় তবে আপনাকে এর পিআইডি ফাইলটির সাথে পথ সরবরাহ করতে হবে PIDFile=

অবশেষে, আপনি উল্লেখ করেছেন যে আপনার ডেমনটি অনেকগুলি প্রক্রিয়া তৈরি করে। এই ক্ষেত্রে, আপনি সেট করতে ইচ্ছুক হতে পারেন KillMode=control-groupএবং systemd সিগ্রুপের সমস্ত প্রক্রিয়াতে সংকেত প্রেরণ করবে।


ধন্যবাদ. একটি শেষ প্রশ্ন: ধরে নেওয়া যাক যে পরিষেবাটি সিস্টেম-সচেতন নয়। সিস্টেমেড পিআইডি ফাইল তৈরি / পরিচালনা করে তাই এই পরিষেবার জন্য আমি সিস্টেমড স্ক্রিপ্টে কী যুক্ত করতে পারি? অতিরিক্তভাবে, পরিষেবাটি টেমপ্লেট ইউনিটগুলির মাধ্যমে একাধিক উদাহরণ হতে পারে, তাই আমরা সাধারণত এটি `systemctl start foo_dameon@1.service" এর মাধ্যমে চালু করি, তাহলে স্ক্রিপ্টটিতে পিআইডি ফাইলের যুক্তিটি কী প্রভাব ফেলবে?
মেঘ

4
@ ডেভনল সিস্টেমড পিআইডি ফাইল তৈরি বা পরিচালনা করে না। এটি করার কোনও কারণ নেই। যদি আপনার পরিষেবা তার নিজস্ব পিআইডি ফাইল তৈরি না করে, তবে সম্ভব হলে এটি অগ্রভাগে চালাতে কনফিগার করুন (ডিমনাইজিংয়ের পরিবর্তে) এবং সিস্টেমড Type=simpleইউনিটে সেট করুন ।
মাইকেল হ্যাম্পটন

1
যদি পরিষেবাটির উপর নির্ভরশীল Type=forkingথাকে তবে (সম্পূর্ণরূপে প্রস্তুত) যখন টাইপ = সহজ করতে পারে না তখন সিস্টেমডকে অবহিত করার (পরিষেবাটি সঠিকভাবে লিখিত থাকলে) সুবিধা রয়েছে। ডেমোনাইজিং কোনও সমস্যা নয়, এমনকি কোনও পিআইডি ফাইল ছাড়াই - সিস্টেমেড যাইহোক মূল প্রক্রিয়াটি অনুসরণ করবে।
মাধ্যাকর্ষণ

1
@ গ্রায়েটি যথেষ্ট সত্য ... যদিও এটি আমার অভিজ্ঞতা হয়ে উঠেছে যে পরিষেবাগুলি সেবাদান শুরু করার আগে তাদের প্রস্তুত করার আগে পরিষেবাগুলি ডিমনাইজ করে। সিস্টেমড-সচেতন পরিষেবাটি Type=notifyসিস্টেমডের জন্য সেরা এবং অনেকগুলি সাধারণ পরিষেবা ইতিমধ্যে এটি করে do তবে সম্ভবত এই উত্তরাধিকার পরিষেবাটি নয়। ওপির ক্ষেত্রে, তার একটি পরিষেবা রয়েছে যা অনেকগুলি প্রক্রিয়া তৈরি করে। Systemd হল ডক্স এই ক্ষেত্রে সে সম্পর্কে সতর্ক করুন
মাইকেল হ্যাম্পটন

1

যেহেতু কেউই প্রয়োজনের কথা উল্লেখ Type=oneshotকরেনি, তাই এখানে একটি সম্পূর্ণ উদাহরণ যা সময়সীমার ব্যর্থতার কারণে উপস্থিত হয়।

[Unit]
Description=timeout test

[Service]
Type=oneshot
TimeoutStartSec=2
ExecStart=/bin/sleep 10
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.