সিস্টেমড সার্ভিস ইউনিট ফাইলগুলিতে গতিশীল পরিবর্তনশীল


14

সিস্টেমড সার্ভিস ইউনিট ফাইলটিতে পরিবেশগত পরিবর্তনশীলগুলি গতিশীলরূপে নিযুক্ত করার কোনও উপায় আছে কি?

আমাদের কাছে একটি মেশিন রয়েছে যার 4 টি জিপিইউ রয়েছে এবং আমরা প্রতি জিপিইউতে একটি নির্দিষ্ট পরিষেবার একাধিক উদাহরণ ঘুরতে চাই। উদাহরণ:

  • gpu_service @ 1: 1.service
  • gpu_service @ 2: 1.service
  • gpu_service @ 3: 1.service
  • gpu_service @ 4: 1.service
  • gpu_service @ 1: 2.service
  • gpu_service @ 2: 2.service
  • gpu_service @ 3: 2.service
  • gpu_service @ 4: 2.service
  • বিরক্তিকরভাবে

সুতরাং 1: 1, 2: 1, ইত্যাদি কার্যকরভাবে পরিষেবা ইউনিট ফাইলে% i।

পরিষেবাটি কোনও নির্দিষ্ট জিপিইউতে আবদ্ধ হওয়ার জন্য, পরিষেবা নির্বাহযোগ্য একটি নির্দিষ্ট পরিবেশের পরিবর্তনশীল পরীক্ষা করে, যেমন:

USE_GPU=4

আমি কি কোনও উপায়ে সার্ভিস ইউনিট ফাইলের ভিতরে% i নিয়ে যেতে এবং জিপিইউ নম্বরটি আনতে কিছু (শেল) ফাংশন দিয়ে চালাতে পারি এবং তারপরে আমি সেই অনুযায়ী USE_GPU পরিবেশ পরিবর্তনশীল সেট করতে পারি?

সর্বাধিক গুরুত্বপূর্ণ, আমি একাধিক /etc/systemd/system/gpu_service@x:y.service/local.confফাইল লেখার ঝামেলা চাই না যাতে আমি আরও উদাহরণগুলি স্পিন করতে পারি।

উত্তর:


10

আপনি যদি সাবধান হন তবে ইনস্ট্যান্স সার্ভিস ফাইলে একটি ছোট বাশ স্ক্রিপ্ট ক্রমটি আপনার এক্সিকিউট কমান্ড হিসাবে অন্তর্ভুক্ত করতে পারেন। যেমন

ExecStart=/bin/bash -c 'v=%i; USE_GPU=$${v%:*} exec /bin/mycommand'

$$স্ট্রিং একটি একক হয়ে যাবে $ফলাফলের ব্যাশ প্রেরণ মধ্যে, কিন্তু আরো গুরুত্বপূর্ণ বন্ধ করবে ${...}systemd হল দ্বারা ইন্টারপোলেট হওয়া থেকে। (সিস্টেমেডের পূর্ববর্তী সংস্করণগুলি ব্যবহারের নথিভুক্ত করেনি $$, সুতরাং এটির সমর্থিত কিনা তা আমি জানি না)।


আমি এরকম কিছু করে শেষ করেছি। :)
কাল

1
bash -cইউনিট ফাইল থেকে কোনও প্রোগ্রাম শুরু করতে কল করুন? কল exec? এটি একটি ফর্কলিফ্টের উপরে (সম্ভবত অন্য কোনও ফর্কলিফ্টের উপরে রয়েছে) উপরে একটি কাঁটাচামচ ব্যবহার করার মতো কারণ প্রথম ফর্কলিফ্টটিতে আসলে ফর্কলিফ্টিংয়ে সমস্যা হয়।
ডেভিড টনহোফার

দুর্ভাগ্যক্রমে আপনি এনভিভি ফাইল লেখার জন্য এক্সিকিস্টার্টপ্রে ব্যবহার করতে পারবেন না, তবে এটি ব্যবহার করুন, স্পষ্টতই এটি আগে লেখা উচিত, তাই এরকম কিছু কাজ করবে। বা বিভাজনটি করতে একটি মোড়ক স্ক্রিপ্ট :) অন্য উদ্ভট বিকল্পটি হ'ল এনভির সেটআপ করার জন্য অন্য পরিষেবা তৈরি করা। ফাইল, নিশ্চিত করুন যে হউক না কেন টেমপ্লেট সঙ্গে কাজ করবে না: stackoverflow.com/a/42841480/32453
rogerdpack

8

কোনভাবে নির্মিত হয় না। আপনার পরিষেবা শুরু হওয়ার আগে আপনাকে এই জিনিসগুলি করা দরকার। একটি উপায় এটি একটি পরিবেশের ফাইলে রাখা হবে।

[Service]
# Note you need to escape percentage sign
ExecStartPre=/bin/sh -c "my_awesome_parser %%i > /run/gpu_service_%i"
EnvironmentFile=/run/gpu_service_%i
ExecStart=...

3

দেখে মনে হচ্ছে আপনি বাস্তবে একটি সিস্টেমড ইউনিট ফাইলের মধ্যে পরিবেশের পরিবর্তনগুলি সেট করতে পারেন ...

মন্তব্যকারীদের কাছ থেকে দেওয়া পরামর্শগুলি, এখানে সমাধানটি দেওয়া হয়েছে:

সিস্টেমড ইউনিটগুলিতে পরিবেশের ভেরিয়েবল ব্যবহার করা

পরিবেশের নির্দেশনা

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

নীচের উদাহরণ সহ, আপনি এনক্রিপশন ব্যবহার করতে আপনার etcd2 ডিমন কনফিগার করতে পারেন। /etc/systemd/system/etcd2.service.d/30-certificates.confইত্যাদি জন্য ঠিক ড্রপ-ইন তৈরি করুন। সার্ভিস:

[Service]
# Client Env Vars
Environment=ETCD_CA_FILE=/path/to/CA.pem
Environment=ETCD_CERT_FILE=/path/to/server.crt
Environment=ETCD_KEY_FILE=/path/to/server.key
# Peer Env Vars
Environment=ETCD_PEER_CA_FILE=/path/to/CA.pem
Environment=ETCD_PEER_CERT_FILE=/path/to/peers.crt
Environment=ETCD_PEER_KEY_FILE=/path/to/peers.key

তারপরে চালনা করুন sudo systemctl daemon-reloadএবং sudo systemctl restart etcd2.serviceetcd2 ডিমনটিতে নতুন পরিবেশ প্রয়োগ করুন।

নিম্নলিখিত ইউআরএল থেকে নেওয়া উদ্ধৃত পাঠ্য: https://coreos.com/os/docs/latest/ using-en वातावरण-variables-in-systemd-units.html


2
যদিও এটি তাত্ত্বিকভাবে প্রশ্নের উত্তর দিতে পারে, তবে এখানে উত্তরের প্রয়োজনীয় অংশগুলি অন্তর্ভুক্ত করা এবং রেফারেন্সের জন্য লিঙ্ক সরবরাহ করা ভাল।
স্টিফেন রাউচ

1
আপনার মন্তব্য তাত্ত্বিক stackexchange আমার ভবিষ্যৎ প্রতিক্রিয়া উন্নত হতে পারে, তখন এটা বাঞ্ছনীয় হবে আপনি শুধু বাতলান কিভাবে অযোগ্য কেউ হতে পারে :) মন্তব্য আপনার মন্তব্যে উত্তর অপরিহার্য অংশের অন্তর্ভুক্ত করেছেন করার জন্য পরিবর্তে
CyberK

1
স্ট্যাক এক্সচেঞ্জে স্বাগতম! মন্তব্যের জন্য ধন্যবাদ, আপনি আমাকে হাসি দিয়েছেন। আপনার উত্তর সম্পাদনা করতে সময় দেওয়ার জন্য ধন্যবাদ। আমরা এমন কিছু তৈরির চেষ্টা করছি যা সময়ের সাথে সাথে মূল্যবান হবে এবং কেবলমাত্র উত্তরগুলি লিঙ্ক করা খুব ভাল বয়স হয় না।
স্টিফেন রাউচ

আপনি যদি Environment=ABC=%iএটি যুক্ত করেন তবে তা enর্ষাকে সেট করে। পরিবর্তনশীল "সম্পূর্ণ% i" তে পরিবর্তনশীল। আমি অনুমান করি আপনি যে "কোট ছাড়িয়ে স্টাফ" চান না তা কেটে ফেলার জন্য আপনি একটি মোড়ক তৈরি করতে পারেন, এবং এটি আসল এক্সিকিউটেবল বলে। তবে আপনি যদি একটি মোড়ক তৈরি করেন তবে আপনি %iএটির পক্ষে যুক্তি হিসাবে সবেমাত্র প্রবেশ করতে পারেন:ExecStart=my_wrapper %i
রোজারডপ্যাক

প্রশ্নটি ছিল "গতিশীল" ভেরিয়েবলের জন্য; আপনি কেবল আমাদের স্থির সমাধানের উত্তর দিয়েছেন।
ওথিয়াস

0

এটি কুৎসিত এবং আপনি যা চেয়েছিলেন তা তেমন নয়, না এটি অটোস্টার্টের জন্যও অনুমতি দেয় না, তবে অনুগামীদের ক্ষেত্রে সিস্টেমট্যাক্ট পরিবেশ ব্যবহার করে কিছু করা সম্ভব :

$ sudo systemctl set-environment USE_GPU=4 # add it to the env. variables for future services
$ sudo systemctl start gpu_service@4:2.service

সম্ভব সমস্ত উপায়ে তালিকাভুক্ত করার চেষ্টা করছি :)

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.