প্রশ্ন কিভাবে systemd সেবা পরিবেশ পরিবর্তনশীল সেট করতে?


আমি একটি আছে Systemd সঙ্গে আর্কি লিনাক্স সিস্টেম এবং আমি আমার নিজের সেবা তৈরি করেছি। কনফিগারেশন সেবা /etc/systemd/system/myservice.service এটা এমন দেখতে:

[Unit]
Description=My Daemon

[Service]
ExecStart=/bin/myforegroundcmd

[Install]
WantedBy=multi-user.target

এখন আমি একটি পরিবেশগত পরিবর্তনশীল সেট করতে চান /bin/myforegroundcmd। আমি কেমন করে ঐটি করি?


119
2017-08-01 19:43


উত্স




উত্তর:


টাইমস পরিবর্তন এবং তাই ভাল অনুশীলন না।

দ্য বর্তমান এই কাজ করার সেরা উপায় চালানো হয় systemctl edit myservice, যা আপনার জন্য একটি ওভাররাইড ফাইল তৈরি করবে বা আপনি একটি বিদ্যমান সম্পাদনা করতে দেয়।

স্বাভাবিক ইনস্টলেশনের মধ্যে এটি একটি ডিরেক্টরি তৈরি করবে /etc/systemd/system/myservice.service.d, এবং সেই ডিরেক্টরির ভিতরে একটি ফাইল যার নাম শেষ হয় .conf (সাধারণত, override.conf), এবং এই ফাইলে আপনি বিতরণ দ্বারা প্রেরিত ইউনিটের যেকোনো অংশ যোগ বা ওভাররাইড করতে পারেন।

উদাহরণস্বরূপ, একটি ফাইল /etc/systemd/system/myservice.service.d/myenv.conf:

[Service]
Environment="SECRET=pGNqduRFkB4K9C2vijOmUDa2kPtUhArN"
Environment="ANOTHER_SECRET=JP8YLOc2bsNlrGuD6LVTq7L36obpjzxd"

এছাড়াও নোট করুন যে যদি ডিরেক্টরিটি বিদ্যমান থাকে এবং খালি থাকে, তবে আপনার পরিষেবাকে অক্ষম করা হবে! আপনি যদি ডিরেক্টরির মধ্যে কিছু না করার ইচ্ছা করেন তবে নিশ্চিত করুন যে এটি বিদ্যমান নয়।


রেফারেন্স জন্য, পুরানো উপায় ছিল:

প্রস্তাবিত উপায় এটি একটি ফাইল তৈরি করা হয় /etc/sysconfig/myservice যা আপনার ভেরিয়েবল রয়েছে, এবং তারপর তাদের সঙ্গে লোড EnvironmentFile

সম্পূর্ণ বিবরণের জন্য, Fedora এর ডকুমেন্টেশন দেখুন একটি systemd স্ক্রিপ্ট লিখতে কিভাবে


144
2017-08-01 20:07



আমি অনুমান sysconfig পাথ ফেডোরা নির্দিষ্ট কিন্তু এই প্রশ্ন আর্ক লিনাক্স সম্পর্কে। পল্লু দ্বারা উত্তর আরো আকর্ষণীয় আমি মনে করি - Ludovic Kuty
/etc/sysconfig ফেডোরা-নির্দিষ্ট। AFAIR আর্কি লিনাক্স কনফিগারেশন ফাইলগুলিকে প্যাকেজ-নির্দিষ্ট জায়গায় পরিবর্তনের জন্য ঠেকাচ্ছিল /etc ফেডোরা-নির্দিষ্ট অবস্থানের পরিবর্তে। মত /etc/myservice.conf, যদিও অতিরিক্ত ফাইল ব্যবহার করে এখানে সঠিক উপায় মনে হচ্ছে না। - Michał Górny
না না না. / etc / sysconfig recomended হয় না। এটি ডেবিয়ান থেকে / etc / default / * সহ নিরুৎসাহিত, কারণ তারা নিরর্থক, এবং নামগুলি অর্থহীন এবং শুধুমাত্র পিছনে সামঞ্জস্যের কারণগুলির জন্য ইন্দ্রিয়গ্রাহ্য (সমস্ত / ইত্যাদি সিস্টেমের কনফিগারেশন সম্পর্কে, কেবলমাত্র / etc / sysconfig, এবং / etc / ডিফল্টগুলি ওভাররাইডের জন্য, ডিফল্ট নয়)। কেবল ইউনিট ফাইলটিতে সরাসরি সংজ্ঞাগুলি রাখুন, অথবা যদি এটি সম্ভব না হয়, তবে একটি এনভায়রনমেন্ট ফাইলের মধ্যে একটি প্যাকেজ নির্দিষ্ট অবস্থান রয়েছে (যেমন Michał এর মন্তব্য প্রস্তাব করে)। - zbyszek
@ ফ্রেডিকিকনর্ড এটি শুধু পরিবর্তনশীল = মান জোড়া, যেমন DJANGO_SETTINGS_MODULE=project.settings, প্রতি লাইন এক। - Michael Hampton♦
@MichaelHampton আপনি কি "বর্তমান সেরা উপায়" এর জন্য ডকুমেন্টেশন লিঙ্ক যোগ করতে পারেন? - jb.


ভেরিয়েবলটি ধ্রুবক (যেটি ব্যবহারকারীকে ইউনিট পাওয়ার মাধ্যমে সংশোধন করা উচিত নয়) বা পরিবর্তনশীল (ব্যবহারকারী দ্বারা সেট করা অনুমিত) কিনা তা উত্তরটি নির্ভর করে।

যেহেতু এটি আপনার স্থানীয় ইউনিট, তাই সীমানাটি বেশ অস্পষ্ট এবং উভয় উপায়ে কাজ করবে। তবে, যদি আপনি এটি বিতরণ শুরু করেন এবং এটি শেষ হয়ে যায় /usr/lib/systemd/system, এই গুরুত্বপূর্ণ হয়ে উঠবে।

ধ্রুবক মান

মান প্রতি ইনস্ট্যান্স পরিবর্তন করার প্রয়োজন হয় না, পছন্দসই উপায় হিসাবে এটি স্থাপন করা হবে Environment=, ইউনিট ফাইল সরাসরি:

[Unit]
Description=My Daemon

[Service]
Environment="FOO=bar baz"
ExecStart=/bin/myforegroundcmd

[Install]
WantedBy=multi-user.target

এর সুবিধা হল পরিবর্তনশীলটি একক ফাইলের সাথে একক রাখা হয়। অতএব, ইউনিট ফাইল সিস্টেমের মধ্যে সরানো সহজ।

পরিবর্তনশীল মান

যাইহোক, sysadmin স্থানীয়ভাবে পরিবর্তনশীল পরিবেশের মান পরিবর্তন করতে অনুমিত হয় যখন উপরে সমাধান ভাল কাজ করে না। আরো বিশেষভাবে, ইউনিট ফাইলটি আপডেট হওয়ার সময় প্রতিবার নতুন মান সেট করতে হবে।

এই ক্ষেত্রে, একটি অতিরিক্ত ফাইল ব্যবহার করা হয়। কিভাবে - সাধারণত বিতরণ নীতি উপর নির্ভর করে।

এক বিশেষ আকর্ষণীয় সমাধান ব্যবহার করা হয় /etc/systemd/system/myservice.service.d ডিরেক্টরি। অন্যান্য সমাধানগুলির বিপরীতে, এই ডিরেক্টরি systemd দ্বারা সমর্থিত এবং তাই কোনও বিতরণ-নির্দিষ্ট পাথের সাথে আসে না।

এই ক্ষেত্রে, আপনি একটি ফাইল মত /etc/systemd/system/myservice.service.d/local.conf যে একক ফাইলের অনুপস্থিত অংশ যোগ করে:

[Service]
Environment="FOO=bar baz"

এর পরে, systemd শুরু করার সময় systemd দুটি ফাইল মার্জ করে (মনে রাখবেন systemctl daemon-reload তাদের মধ্যে পরিবর্তন করার পরে)। এবং এই পাথ systemm দ্বারা সরাসরি ব্যবহার করা হয়, আপনি ব্যবহার করবেন না EnvironmentFile= এই জন্য।

যদি মানটি শুধুমাত্র প্রভাবিত কিছু সিস্টেমে পরিবর্তিত হয় তবে আপনি উভয় সমাধানগুলি একত্রিত করতে পারেন, সরাসরি ইউনিটটিতে ডিফল্ট সরবরাহ এবং অন্য ফাইলে স্থানীয় ওভার्राাইড সরবরাহ করতে পারেন।


67
2018-04-23 07:48



systemctl daemon-reload systemd পুনরায় লোড কমান্ড - Dmitry Buzolin
EnvironmentFile= মান ভালো পাসওয়ার্ড যখন গোপন হয়। দেখ আমার উত্তর বিস্তারিত জানার জন্য. - Don Kirkby


http://0pointer.de/public/systemd-man/systemd.exec.html#Environment= - আপনার দুটি বিকল্প রয়েছে (এক ইতিমধ্যে মাইকেল দ্বারা নির্দেশিত):

Environment=

এবং

EnvironmentFile=

34
2017-10-16 13:55





মাইকেল একটি পরিষ্কার সমাধান দিয়েছেন কিন্তু আমি স্ক্রিপ্ট থেকে আপডেট env পরিবর্তনশীল পেতে চেয়েছিলেন। দুর্ভাগ্যবশত bash কমান্ড executing systemd ইউনিট ফাইলে সম্ভব নয়। ভাগ্যক্রমে আপনি ExecStart ভিতরে bash ট্রিগার করতে পারেন:

http://www.dsm.fordham.edu/cgi-bin/man-cgi.pl?topic=systemd.service&ampsect=5

উল্লেখ্য যে এই সেটিংটি সরাসরি শেল কমান্ড লাইন সমর্থন করে না। শেল কমান্ড লাইন ব্যবহার করা হলে তাদের কিছু শেল বাস্তবায়নের জন্য স্পষ্টভাবে প্রেরণ করতে হবে।

আমাদের ক্ষেত্রে উদাহরণ তারপর হয়:

[Service]
ExecStart=/bin/bash -c "ENV=`script`; /bin/myforegroundcmd"

6
2017-07-23 13:31



এটি একাধিক কারণে কাজ করবে না (যদি না এটি একটি "এক-শট" পরিষেবা, যা বরং অর্থহীন)। আমি কাজ করার জন্য নিম্নলিখিত পেতে পরিচালিত: /bin/bash -a -c 'source /etc/sysconfig/whatever && exec whatever-program'। দ্য -a পরিবেশটি সাব-প্রসেসে এক্সপোর্ট করা নিশ্চিত করে (যদি না আপনি সমস্ত ভেরিয়েবলকে পূর্বরূপ করতে চান whatever সঙ্গে export ) - Otheus
কেন এটা কাজ করবে না? এটা সবসময় সম্পূর্ণ কমান্ড ট্রিগার করা উচিত যা স্ক্রিপ্ট নির্বাহ অন্তর্ভুক্ত, তাই না? - user1830432
হতে পারে ExecStart=/usr/bin/env ENV=script /bin/myforegroundcmd এই ক্ষেত্রে একটু ভাল সমাধান। - kstep
@ ওথাস: গ্রেট উত্তর, যেদিন টম্যাট 8 ইউনিট ফাইল তৈরি করতে হয়েছিল সেদিন সেভ করে। - Daniel
একটি systemd পরিষেবা ফাইলের মধ্যে "bash কমান্ড" চালানোর একটি উপায় রয়েছে। এই লিঙ্কটি দেখুন: coreos.com/os/docs/latest/... - Mark Lakata


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

যদি আপনি আপনার পরিষেবাতে একটি পরিবেশগত পরিবর্তনশীল পাস করতে চান, করো না ব্যবহার Environment= ইউনিট কনফিগারেশন ফাইল। ব্যবহার EnvironmentFile= এবং এটি অন্য কনফিগারেশন ফাইলের দিকে নির্দেশ করুন যা শুধুমাত্র পরিষেবা অ্যাকাউন্ট (এবং ব্যবহারকারীদের রুট অ্যাক্সেস সহ ব্যবহারকারীদের পাঠযোগ্য) পাঠযোগ্য।

ইউনিট কনফিগারেশন ফাইলের বিশদটি এই কমান্ডের সাথে যে কোনো ব্যবহারকারীর কাছে দৃশ্যমান:

systemctl show my_service

আমি একটি কনফিগারেশন ফাইল রাখা /etc/my_service/my_service.conf এবং সেখানে আমার গোপন রাখুন:

MY_SECRET=correcthorsebatterystaple

তারপর আমার সেবা ইউনিট ফাইল, আমি ব্যবহার EnvironmentFile=:

[Unit]
Description=my_service

[Service]
ExecStart=/usr/bin/python /path/to/my_service.py
EnvironmentFile=/etc/my_service/my_service.conf
User=myservice

[Install]
WantedBy=multi-user.target

আমি যে চেক ps auxe ঐ পরিবেশ ভেরিয়েবল দেখতে পাচ্ছেন না, এবং অন্যান্য ব্যবহারকারীদের অ্যাক্সেস নেই /proc/*/environ। অবশ্যই, আপনার নিজস্ব সিস্টেম চেক করুন।


6
2018-05-04 00:29