একসাথে বেশ কয়েকটি ইনস্ট্যান্স বন্ধ / শুরু করতে ভার্চুয়াল সিস্টেমড পরিষেবা কীভাবে তৈরি করবেন?


12

আমি গ্রাহকদের জন্য একই ওয়েব অ্যাপ্লিকেশনটির কয়েকটি উদাহরণ হোস্ট করার পরিকল্পনা করছি systemd। আমি সক্ষম হতে চাই stopএবং startপ্রতিটি গ্রাহক উদাহরণ ব্যবহারের systemdপাশাপাশি গ্রাহক দৃষ্টান্তের পুরো সংগ্রহকে একক পরিষেবা হিসাবে চিকিত্সা করি যা বন্ধ এবং একসাথে শুরু করা যেতে পারে।

systemdআমার যে বিল্ডিং ব্লকগুলি ব্যবহার করার প্রয়োজন তা PartOfএবং টেমপ্লেট ইউনিট ফাইলগুলি সরবরাহ করে বলে মনে হচ্ছে তবে আমি পিতামাতার পরিষেবাটি বন্ধ করে দিয়েছি, শিশু গ্রাহক পরিষেবা বন্ধ হচ্ছে না। সিস্টেমড দিয়ে আমি কীভাবে এই কাজটি করতে পারি? আমার এখন পর্যন্ত যা আছে তা এখানে।

প্যারেন্ট ইউনিট ফাইল app.service,:

[Unit]
Description=App Web Service

[Service]
# Don't run as a deamon (because we've got nothing to do directly)
Type=oneshot
# Just print something, because ExecStart is required
ExecStart=/bin/echo "App Service exists only to collectively start and stop App instances"
# Keep running after Exit start finished, because we want the instances that depend on this to keep running
RemainAfterExit=yes
StandardOutput=journal

app@.serviceগ্রাহক দৃষ্টান্ত তৈরি করতে ব্যবহৃত একটি ইউনিট টেম্পলেট ফাইল :

[Unit]
Description=%I Instance of App Web Service

[Service]
PartOf=app.service
ExecStart=/home/mark/bin/app-poc.sh %i
StandardOutput=journal

আমার app-poc.shস্ক্রিপ্ট (ধারণার প্রমাণ যা কেবল একটি লুপে ফাইল লগ করতে প্রিন্ট করে):

#!/bin/bash
# Just a temporary code to fake a full daemon.
while :
do
  echo "The App PoC loop for $@"
  sleep 2;
done

ধারণার প্রমাণের জন্য, আমি সিস্টেমেড ইউনিট ফাইলগুলি পেয়েছি ~/.config/systemd/user

আমি তখন পিতামাতা এবং টেমপ্লেটের উপর ভিত্তি করে একটি উদাহরণ শুরু করি (পরে systemctl --user daemon-reload):

systemctl --user start app
systemctl --user start app@customer.service

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

systemctl --user stop app

ধন্যবাদ!

(আমি সিস্টেমড 229 সহ উবুন্টু 16.04 ব্যবহার করছি)।


1
"পার্টঅফ = প্রয়োজনীয়তা = এর মতো নির্ভরতা কনফিগার করে তবে ইউনিটগুলি থামানো এবং পুনরায় চালু করতে সীমাবদ্ধ to" আপনি যদি কাজ শুরু করতে চান তবে আপনার Requires=পরিবর্তে কী ব্যবহারের দরকার নেই ?
সোর্সজেদি

উত্তর:


10

আপনার লাইনটি সরানো দরকার

PartOf=app.service

এর বাইরে [Service]এবং ভেতরে [Unit]অধ্যায়, এবং যোগ [Unit]এর app.serviceগ্রাহকদের তালিকা শুরু করার জন্য, যেমন

Wants=app@customer1.service app@customer2.service

বা সোর্সজেদী মন্তব্যগুলিতে যেমন বলেছিলেন, Requires=একই জিনিস। আপনি রাখতে পারবেন না PartOfমত যে উপরোক্ত তালিকাতে নেই সেবা বন্ধ করতে হাত দ্বারা আপনি শুরু, systemctl --user start app@customer3.service


আমি নিশ্চিত করেছিলাম যে আপনি ঠিক ছিলেন PartOf। ধন্যবাদ। আমি একটি সিমিলিংকের মাধ্যমে "ওয়ান্টস" পরিচালনা করতে যাচ্ছি, যা সিস্টেমড সহ নতুন গ্রাহককে সক্রিয় করার জন্য আমার নেওয়া একক পদক্ষেপ হয়ে যায়। আমার পরীক্ষার ক্ষেত্রে: n ln -s / home/mark/.config/systemd/user/app@.service / home / চিহ্ন / .config / systemd / user / app.service.wants / ऐकিয়া @ foo.service`
মার্ক স্টোসবার্গ

14

আমি শিখেছি যে "টার্গেট ইউনিট" সিস্টেমিত এটির জন্য। একটি টার্গেট ইউনিট ব্যবহার করে, আমি [Service]আমার উপরের জাল বিভাগটি তৈরি না করেই চাই সুবিধাগুলি পাচ্ছি । একটি কার্যকারী উদাহরণ "টার্গেট ইউনিট" ফাইলটি দেখতে এমন দেখাচ্ছে:

# named like app.target
[Unit]
Description=App Web Service

# This collection of apps should be started at boot time.
[Install]
WantedBy=multi-user.target

তারপর প্রতিটি গ্রাহকের উদাহরণস্বরূপ অন্তর্ভুক্ত করা উচিত PartOfমধ্যে [Unit](@meuh দ্বারা সরু আউট হিসাবে) অধ্যায়, এবং এছাড়াও একটি থাকতে হবে [Install]যাতে অধ্যায় enableএবং disableনির্দিষ্ট পরিষেবা কাজ করবে:

# In a file name like app@.service
[Unit]
Description=%I Instance of App Web Service
PartOf=app.target

[Service]
ExecStart=/home/mark/bin/app-poc.sh %i
Restart=on-failure
StandardOutput=journal

# When the service runs globally, make it run as a particular user for added security
#User=myapp
#Group=myapp

# When systemctl enable is used, make this start when the App service starts
[Install]
WantedBy=app.target

গ্রাহকের উদাহরণ আনতে এবং লক্ষ্যটি শুরু হওয়ার সাথে সাথে এটি শুরু করতে, এই এক-সময় সক্ষম কমান্ডটি ব্যবহৃত হবে:

 systemctl enable app

এখন এই সময়ে আমি ব্যবহার করতে পারেন stopএবং startউপর app@customerকরার জন্য একটি নির্দিষ্ট উদাহরণস্বরূপ, অথবা আমি ব্যবহার করতে পারেন start appএবং stop appসব অ্যাপ্লিকেশান একসঙ্গে থামাতে।


স্ট্যাটাস কেমন? অ্যাপ্লিকেশনটি যে সমস্ত পরিষেবা চেয়েছিল তার স্থিতি পাওয়ার সহজ উপায় আমি খুঁজে পাচ্ছি না। আমি জানি কীভাবে আমি এটি স্ক্রিপ্ট করতে পারি, তবে ...
টম্মি কিন্টোলা

1
আমি বলতে চাইছি যে লক্ষ্য গোষ্ঠীতে অ্যাপ্লিকেশনগুলির স্ট্যাটাসটি তার অংশের সবগুলি তালিকাভুক্ত না করে, ওয়াইল্ড কার্ডগুলি বা না, পছন্দমত সেই গোষ্ঠীর নামটি ব্যবহার না করা এবং এটি কী কী তৈরি তা যত্নবান না করে।
টমমি কিন্টোলা

2
এটা অত সস্তা না. সেই স্ক্রিপ্টটি কোন প্যাকেটের অন্তর্ভুক্ত? প্রতিবার নতুন উপাদান যুক্ত হওয়ার সাথে সাথে এটি সংশোধন করতে হবে। তা ভুলে যান এবং স্থাপনা / রক্ষণাবেক্ষণটি হায়াওয়াইরে যায়। আমি কি স্পষ্টত চাই চাই শুধু partOf গোষ্ঠীর এটা উপস্থিতি ইঙ্গিত সেটিং এবং সঙ্গে একটি নতুন প্যাকেট যোগ হয় না তারপর কিছু স্ক্রিপ্ট সম্পর্কে দীর্ঘস্থায়ী পরিবর্তন করুন। এবং তারপরে থামুন এবং সেই লক্ষ্যটির শুরু আগের মতো কাজ করে। এটি কাজ করে তবে স্থিতিটি সেই সুযোগের বাইরে চলে যাচ্ছে বলে মনে হচ্ছে। এমনকী আমি কোনও লক্ষ্যে রানটাইম উপস্থিত থাকা ইউনিটগুলির তালিকা পাওয়ার কোনও উপায়ও খুঁজে পাচ্ছি না। এই ব্যবহারের কেসটি সিস্টেমড দ্বারা আচ্ছাদিত নয়।
টমমি কিন্টোলা

2
@ টম্মিকিন্টোলা এখানে একটি ব্যাশ ওয়ান-লাইনার যা লক্ষ্য নির্ভরতা পরিবর্তনের জন্য আপনাকে আপডেট করার দরকার নেই:systemctl status $(systemctl list-dependencies --plain otp.target)
মার্ক স্টসবার্গ

2
@ টম্মিকিন্টোলা আমি সম্মতি জানাই যে systemdএখানে ব্যবহারের উন্নতি করতে পারে। আমি লক্ষ্যগুলির জন্য উন্নত স্থিতির প্রস্তাব দেওয়ার জন্য একটি বৈশিষ্ট্য অনুরোধটি খুললাম
মার্ক স্টসবার্গ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.