সিস্টেমড সার্ভিসটি শুরু করার সাথে সাথে হত্যা করে


15

আমি ওএসএসইসি এইডস-এর জন্য সিস্টেমড ইউনিট ফাইল লিখছি। সমস্যাটি হ'ল সিস্টেমেড সার্ভিস শুরু করলে তা তাত্ক্ষণিক তাদের থামিয়ে দেয়।

আমি যখন এক্সিকিস্টার্টের নির্দেশনাটি ব্যবহার করি তখন সমস্ত কাজ সূক্ষ্ম হয়।

ExecStart=/var/ossec/bin/ossec-control start

তবে যখন আমি ছোট উন্নতি করি তখন আমি ওএসএসইসি লগগুলিতে সূক্ষ্ম করি, এটি শুরুর পরে সাইন 15 পেয়ে যায়।

ExecStart=/bin/sh -c '${DIRECTORY}/bin/ossec-control start'

আমি যদি অন্য একটি ছোট পরিবর্তন পরিষেবা তৈরি করি তবে 20 সেকেন্ডের পরে SIG 15 পাবেন।

ExecStart=/bin/sh -c '${DIRECTORY}/bin/ossec-control start && sleep 20'

সুতরাং, আমি অনুমান করি যে সিস্টেমটি সার্ভিস শুরুর পরে / বিন / শ প্রক্রিয়াটিকে মেরে ফেলেছে এবং বিন / শ তার পরে ওএসএসইকে হত্যা করে।

কিভাবে আমি এই সমস্যার সমাধান করতে পারে?


1
পরিষেবার ধরণ কী?
উইল্যান্ড 13

@ ওয়েল্যান্ড, আমি চেষ্টা করছিলাম সহজ এবং দৃ for়তার সাথে, কিন্তু ফলাফল এখনও একই।
ড্যানিল স্বেতলভ

উত্তর:


37

প্রস্তুতি প্রোটোকল মেলেনি

উইল্যান্ড সূচিত হিসাবে, Typeপরিষেবাটি গুরুত্বপূর্ণ। প্রস্তুতি প্রোটোকল সিস্টেমযুক্ত পরিষেবাটি কী কথা বলবে তা সেটিকে সেটিংটি নির্দেশ করে । একটি simpleপরিষেবা অবিলম্বে প্রস্তুত বলে ধরে নেওয়া হয়। কোনও forkingপরিষেবা প্রস্তুত হওয়ার জন্য তার প্রাথমিক প্রক্রিয়াটি একটি শিশুকে কাঁটাচামচ করে দেয় এবং তারপরে বাইরে চলে যায়। একটি dbusসেবা যখন একটি সার্ভার ডেস্কটপ বাস প্রদর্শিত প্রস্তুত হতে নেওয়া হয়। এবং তাই এগিয়ে।

আপনি যদি পরিষেবাটি কী করে সেটির সাথে মিলানোর জন্য পরিষেবা ইউনিটে ঘোষণা করা প্রস্তুতি প্রোটোকলটি না পান, তবে জিনিসগুলি ঘৃণিত হয়। প্রস্তুতি প্রোটোকল মেলেনি ম্যাচের কারণে পরিষেবাগুলি সঠিকভাবে শুরু না হয়, বা (আরও সাধারণত) সিস্টেমড দ্বারা ব্যর্থ হিসাবে চিহ্নিত (ভুল) হয়। যখন কোনও পরিষেবা সিস্টেমড চালু করতে ব্যর্থ হিসাবে দেখা যায় তা নিশ্চিত করে যে পরিষেবাটি যথাযথভাবে নিষ্ক্রিয়তায় ফিরিয়ে আনার জন্য পরিষেবার প্রতিটি অনাথ অতিরিক্ত প্রক্রিয়া যাতে ব্যর্থতার অংশ হিসাবে চালিত রেখে গেছে (তার দৃষ্টিকোণ থেকে) মারা যায় অবস্থা.

আপনি ঠিক এই করছেন।

প্রথম সব, সহজ কাপড়: sh -cমিলছে না Type=simpleবা Type=forking

ইন simpleপ্রোটোকল, প্রাথমিক প্রক্রিয়া গ্রহণ করা হয় হতে সেবা প্রক্রিয়া। কিন্তু বাস্তবে একটি sh -cমোড়ক একটি শিশু প্রক্রিয়া হিসাবে প্রকৃত পরিষেবা প্রোগ্রাম চালায় । সুতরাং MAINPIDভুল হয়ে যায় এবং শুরু করা ExecReloadকাজ করা বন্ধ করে দেয়। যখন ব্যবহার Type=simple, এক পারেন ব্যবহার করা আবশ্যক sh -c 'exec …'অথবা ব্যবহার করবেন sh -c প্রথম স্থানে। পরবর্তী লোকেরা প্রায়শই সঠিক কোর্সটি কিছু লোকের চেয়ে বেশি মনে করে।

sh -cকোনটির সাথেও মেলে Type=forkingনা। কোনও forkingপরিষেবার জন্য প্রস্তুতি প্রোটোকলটি বেশ নির্দিষ্ট। প্রাথমিক প্রক্রিয়াটিতে একটি শিশুকে কাঁটাচামচ করতে হবে এবং তারপরে প্রস্থান করতে হবে। systemd এই প্রোটোকলটিতে একটি সময়সীমা প্রয়োগ করে। প্রাথমিক প্রক্রিয়া যদি নির্ধারিত সময়ের মধ্যে কাঁটাচামচ না করে তবে এটি প্রস্তুত হতে ব্যর্থ। প্রাথমিক প্রক্রিয়া যদি নির্ধারিত সময়ের মধ্যে প্রস্থান না করে তবে সেটিও একটি ব্যর্থতা।

অপ্রয়োজনীয় ভয়াবহতা ossec-control

যা আমাদের জটিল জিনিসগুলিতে নিয়ে আসে: সেই ossec-controlস্ক্রিপ্ট।

দেখা যাচ্ছে যে এটি একটি 5 সিস্টেম 5 rcস্ক্রিপ্ট যা 4 এবং 10 টি প্রক্রিয়াগুলির মধ্যে কাঁটাচামচ করে, যা নিজেরাই তাদের পালা কাঁটাচামচ করে এবং প্রস্থানও করে। এটি সেই 5 সিস্টেমের 5 rcস্ক্রিপ্টগুলির মধ্যে একটি যা forলুপস, রেস শর্তাদি, স্বেচ্ছাসেবীদের sleepএড়াতে চেষ্টা করার সাথে একক স্ক্রিপ্টে সার্ভার প্রক্রিয়াগুলির পুরো সেটটি পরিচালনা করার চেষ্টা করে, ব্যর্থতা মোডগুলি যা অর্ধ-প্রারম্ভিক অবস্থায় সিস্টেমকে শ্বাসরোধ করতে পারে, এবং অন্যান্য সমস্ত ভয়াবহতা যা দু'দশক আগে লোকেরা এআইএক্স সিস্টেম রিসোর্স কন্ট্রোলার এবং ডেমোনটোলসের মতো জিনিস আবিষ্কার করেছিল। এবং আসুন আইডিসিঙ্কক্র্যাটিক enableএবং disableক্রিয়াগুলি প্রয়োগ করতে, বাইনারি ডিরেক্টরিতে লুকানো শেল স্ক্রিপ্টটি ভুলে যাবেন না যা এটি উড়ে আবার লিখেছে।

সুতরাং যখন আপনি /bin/sh -c '/var/ossec/bin/ossec-control start'যা ঘটে তা হ'ল:

  1. সিস্টেমড এটি পরিষেবা প্রক্রিয়া হিসাবে প্রত্যাশা করে যা কাঁটাচামচ করে।
  2. এটাই শেল, যা কাঁটাচ্ছে ossec-control
  3. যা ঘুরে দেখা যায় 4 থেকে 10 নাতি নাতনিদের মধ্যে।
  4. নাতি-নাতনিরা সমস্ত কাঁটাচামচ করে পালা করে বের হয়।
  5. নাতি-নাতনিরা সমস্ত কাঁটাচামচ সমান্তরালে বেরিয়ে আসে।
  6. ossec-control প্রস্থান করে।
  7. প্রথম শেলটি বের হয়।
  8. সেবা প্রসেস ছিল দারুণ-great- নাতি নাতনিদের, কিন্তু কাজ ম্যাচের এই ভাবে তন্ন তন্ন forking নাsimple প্রস্তুতি প্রোটোকল systemd হল সামগ্রিকভাবে সেবা বিবেচনায় ব্যর্থ হয়েছে এবং স্থবির হয়েছে এটি ডাউন ব্যাক।

এই ভয়াবহতার কোনওটিই আসলে সিস্টেমডের অধীনে প্রয়োজনীয় নয়। কোনটাই না.

একটি সিস্টেমযুক্ত টেম্পলেট পরিষেবা ইউনিট

পরিবর্তে, একটি খুব সাধারণ টেম্পলেট ইউনিট লিখেছেন :

[ইউনিট]
বিবরণ = ওএসএসইসি হিডস% আই সার্ভার
= Network.target পর 

[পরিষেবা]
প্রকার = সহজ
এক্সেকস্টার্টপ্রে = / ইউএসআর / বিন / এনভি / ভার / ওস্যাক / বিন /% পি-% আই -t
এক্সেকস্টার্ট = / ইউএসআর / বিন / এনভি / ভের / ওস্যাক / বিন /% পি-% আই-এফ

[ইনস্টল করুন]
WantedBy = multi-user.target

এটি এই হিসাবে সংরক্ষণ করুন /etc/systemd/system/ossec@.service

বিভিন্ন প্রকৃত পরিষেবাগুলি হ'ল এই টেম্পলেটটির ইনস্ট্যান্টেশন named

  • ossec@dbd.service
  • ossec@agentlessd.service
  • ossec@csyslogd.service
  • ossec@execd.service
  • ossec@agentd.service
  • ossec@logcollector.service
  • ossec@syscheckd.service
  • ossec@maild.service
  • ossec@analysisd.service
  • ossec@remoted.service
  • ossec@monitord.service

তারপরে সক্ষম ও অক্ষম ফাংশনটি সরাসরি সার্ভিস ম্যানেজমেন্ট সিস্টেম থেকে আসে ( রেডহ্যাট বাগ 752774 স্থির করে) লুকানো শেল স্ক্রিপ্টগুলির কোনও প্রয়োজন নেই।

 systemctl ওস্যাক @ ডিবিডি ওস্যাক @ এজেন্টলেসড ওস্যাক @ সিএসলগড ওস্যাক @ মাইল্ড ওস্যাক @ এক্সিকিউটড ওস্যাক @ এনালাইসড ওস্যাক @ লগকোলেক্টর ওস্যাক @ রিমোটড ওস্যাক @ সিচেকড ওস্যাক @ মনিটর্ড

তদ্ব্যতীত, সিস্টেমড প্রতিটি প্রকৃত পরিষেবাদি সরাসরি সম্পর্কে জানতে এবং তা জানতে পারে। এটি দিয়ে তাদের লগগুলি ফিল্টার করতে পারে journalctl -u। এটি যখন জানতে পারে যে কোনও ব্যক্তি পরিষেবা কখন ব্যর্থ হয়েছে। কোন পরিষেবাগুলি সক্ষম এবং চলমান হওয়ার কথা তা এটি জানে।

উপায় দ্বারা: Type=simpleএবং -fঅপশনটি এখানে যেমন ঠিক তেমন অন্য অনেক ক্ষেত্রে রয়েছে। বন্য অঞ্চলে খুব কম পরিষেবাগুলি তাদের কৌতুক দ্বারা তাদের তাত্পর্যপূর্ণতার সংকেত দেয়exit এবং এখানে এগুলিও এরকম নয় not তবে এটাই forkingটাইপের মানে। প্রধানতম বুনোতে পরিষেবাগুলি কাঁটাচামচ করে বেরিয়ে আসে কারণ কিছু ভুলের কারণে বুদ্ধিমান ধারণাটি পাওয়া যায় যা ডেমনদের করার কথা। আসলে, এটা না। এটি 1990 এর দশক পরে না। এটা ধরার সময়।

আরও পড়া


2
খুব বিস্তারিত উত্তর! আমি একটি "গ্রুপিং" টার্গেট তৈরি করারও পরামর্শ দেব, বলুন, ossec.target, যা Requires=প্রয়োজনীয় সমস্ত উদাহরণ রয়েছে এবং তারপরে PartOf=ossec.targetওস্যাক @। সার্ভিস সেট করুন । এটি ossec.target শুরু করে এবং বন্ধ করে ওসাকে শুরু এবং বন্ধ করার অনুমতি দেবে।
ইন্টেলএফএক্স

@ জেডিবিপি, বাহ! এই জাতীয় বিস্তারিত উত্তরের জন্য অনেক ধন্যবাদ। আশা করি আমি এই ইউনিটটি তৈরি করব এবং ফলাফলগুলি সম্পর্কে এখানে লিখব। আমি যদিও ছিলাম যে আমি সহজ হব। তবে আপনি ঠিক বলেছেন, ওসেক-কন্ট্রোল একটি সূক্ষ্ম নরক।
ড্যানিল স্বেতলভ

1
/ ইউএসআর / বিন / এনভিকে মোড়ক হিসাবে ব্যবহার করার কারণ কী?
মারিউস গেডমিনাস

1

টাইপ করুন = কাঁটাচামচ রাখুন এবং পরিষেবা / অ্যাপ্লিকেশন কোনও পিড বজায় রাখলে পিড ফাইলের অবস্থান দিন।

[ইউনিট]
বিবরণ = "বুটে অ্যাপ্লিকেশন চালান"
পরে = নেটওয়ার্ক.আরজেট syslog.target অডিট.সার্ভিস

[পরিষেবা]
টাইপ করুন =
পিআইডিফায়ার = / var / চালান / অ্যাপাচি 2 / অ্যাপাচি
2.পিড এক্সস্টার্ট = / ইত্যাদি / init.d / অ্যাপাচি 2 শুরু
ExecStop = জন্য / etc / init.d / apache2 বন্ধ
StandardOutput = syslog- র
StandardError = syslog- র
পুনরারম্ভ = অন ব্যর্থতা
SyslogIdentifier = webappslog

[ইনস্টল করুন]
WantedBy = multi-user.target
ওরফে = webapps


0

কিছুটা সম্পর্কিত, আমার একটি সিস্টেমেড পরিষেবা ছিল যা দেখে মনে হয়েছিল যে সিস্টেমড এটি 30 এর দশকের পরে "হত্যা" করবে।

systemctl status service-namemain process exited, code=exited, status=1/FAILURE30s কেটে যাওয়ার পরে দেখাতে পারে ।

এটি "বিচ্ছিন্নভাবে" সূক্ষ্মভাবে চালিত হবে ( একই পরিবেশের সাথে টার্মিনালে ম্যানুয়ালি মতো )।

এটি ছিল সক্রিয়

Type=forking
...
Environment=ABC="TRUE"
ExecStart=/path/to/my_script_to_spawn_process.sh

my_script_to_spawn_process.shএটির মধ্যে ছিল

/bin/something > /dev/null 2>&1 &

যা কাজ করে কিন্তু আউটপুট লগ সম্পর্কিত তথ্যগুলি বাতিল করে দেয় (সাধারণত এটি কোনও ফাইলে যায়, বা যদি তা না হয়, সম্ভবত journalctl)।

অন্য কোথাও লগ ইন করতে এটি পরিবর্তন করা /bin/something > /tmp/my_file

তারপরে /tmp/my_fileপ্রকৃত কারণটি প্রকাশ করে ing কোনটি (স্পর্শকাতর) যে বাক্সে আপনি Environment=ABC="true"যেমন বাক্য গঠন করতে পারেন তা ব্যবহার করতে পারবেন না , এটির কোনও উদ্ধৃতি বা মূল মূল্য Environment="ABC=true"হ'ল প্রায় 30s এর পরে "সেটআপ পর্বে" আমার প্রক্রিয়াটি "প্রস্থান" থেকে বেরিয়ে আসার কারণ হতে পারে quot


-4

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

জেডিবিপি-র ব্যাখ্যাটি স্বাগত তবে অসম্পূর্ণ এবং তাঁর দাবি যে এটি সমস্ত ওসেক-নিয়ন্ত্রণের ত্রুটিযুক্ত সত্যই সত্য নয়। এমনকি বেশ তুচ্ছ জিনিসগুলি সমস্যাযুক্ত যেমন সমস্যাগুলি ডিবাগ করার জন্য নিরবচ্ছিন্ন লগ লাইন পাওয়া বা প্রসেসগুলি হ্রাস করার সময় সিস্টেমড থেকেই নিজে থেকে অর্থপূর্ণ ত্রুটি বার্তাগুলি পাওয়া।


1
পিআইডি ফাইলগুলি কীভাবে ব্যবহার করা যায়? যদি কোনও প্রদত্ত পরিষেবার জন্য উপস্থিত থাকে তবে সেই পিআইডি সহ একটি আসল প্রক্রিয়া থাকতে পারে এবং নাও হতে পারে এবং যখন সঠিক পিআইডি সহ কোনও প্রক্রিয়া উপস্থিত থাকে, তখন এটি প্রকৃতপক্ষে প্রত্যাশিত পরিষেবা হতে পারে বা নাও হতে পারে।
JoostM
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.