সিস্টেমড পরিষেবায় পরিবেশ পরিবর্তনশীল কীভাবে সেট করবেন?


162

সিস্টেমেড সহ আমার একটি আর্চ লিনাক্স সিস্টেম রয়েছে এবং আমি নিজের পরিষেবা তৈরি করেছি। কনফিগারেশন পরিষেবাটি এর মতো /etc/systemd/system/myservice.serviceদেখাচ্ছে:

[Unit]
Description=My Daemon

[Service]
ExecStart=/bin/myforegroundcmd

[Install]
WantedBy=multi-user.target

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

উত্তর:


196

সময় পরিবর্তন হয় এবং তাই সেরা অভ্যাস।

এটি করার বর্তমান সর্বোত্তম উপায়টি হল চালানো 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

সম্পূর্ণ বিবরণের জন্য, সিস্টেমযুক্ত স্ক্রিপ্ট কীভাবে লিখতে হয় সে সম্পর্কে ফেডোরার ডকুমেন্টেশন দেখুন ।


4
আমি অনুমান করি sysconfigপথটি ফেডোরার জন্য নির্দিষ্ট তবে প্রশ্নটি আর্চ লিনাক্স সম্পর্কে। পালাহর উত্তরটি আমার কাছে আরও আকর্ষণীয় বলে মনে হয়
লুডোভিচ কিউটি

1
/etc/sysconfigফেডোরা-নির্দিষ্ট। আফার আর্চ লিনাক্স /etcফেডোরা-নির্দিষ্ট অবস্থানের পরিবর্তে কনফিগার ফাইলগুলি প্যাকেজ-নির্দিষ্ট কোথাও থাকার জন্য চাপ দিচ্ছিল । পছন্দ করুন /etc/myservice.conf, যদিও অতিরিক্ত ফাইল ব্যবহার করা এখানে সঠিক উপায়ে মনে হচ্ছে না।
মিশা গার্নি

5
না না না. / etc / sysconfig পুনরায় সংযুক্ত করা হয় না। এটি ডেবিয়ান থেকে / ইত্যাদি / ডিফল্ট / * সহ নিরুৎসাহিত করা হয়, কারণ এগুলি অর্থহীন এবং নামগুলি অর্থহীন এবং কেবল পিছনের সামঞ্জস্যতার কারণে (/ ইত্যাদি সমস্ত সিস্টেমের কনফিগারেশন সম্পর্কিত, কেবল / ইত্যাদি / নয়) sysconfig, এবং / etc / ডিফল্ট ওভাররাইডের জন্য, ডিফল্ট নয়)। কেবল ইউনিট ফাইলে সংজ্ঞাগুলি রাখুন, বা যদি এটি সম্ভব না হয় তবে একটি এনভায়ারমেন্ট ফাইলের মধ্যে একটি প্যাকেজ নির্দিষ্ট অবস্থান রয়েছে (যেমন মাইকের মন্তব্য প্রস্তাব দেয়)।
zbyszek

1
@ ফ্রেডরিকনর্ড এটি কেবল পরিবর্তনশীল = মান জোড়া, যেমন DJANGO_SETTINGS_MODULE=project.settingsপ্রতি লাইনে একটি করে।
মাইকেল হ্যাম্পটন

1
@ মিশেলহ্যাম্পটন আপনি কি "বর্তমানের সেরা উপায়" এর জন্য ডকুমেন্টেশন লিঙ্ক যুক্ত করতে পারেন?
জেবি।

77

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

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

ধ্রুবক মান

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

[Unit]
Description=My Daemon

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

[Install]
WantedBy=multi-user.target

এর সুবিধা হ'ল ভেরিয়েবলটি ইউনিট সহ একটি একক ফাইলে রাখা হয়। সুতরাং, ইউনিট ফাইলটি সিস্টেমের মধ্যে সরানো সহজ।

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

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

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

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

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

[Service]
Environment="FOO=bar baz"

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

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


systemctl daemon-reload
সিস্টেমড

EnvironmentFile=মানগুলি যখন পাসওয়ার্ডের মতো গোপন থাকে তখন ভাল হয়। বিস্তারিত জানার জন্য আমার উত্তর দেখুন ।
ডন কার্কবি


17

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

যদি আপনি নিজের সেবায় পরিবেশের পরিবর্তনশীলটি পাস করতে চান তবে ইউনিট কনফিগারেশন ফাইলে ব্যবহার করবেন না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 auxethose পরিবেশের পরিবর্তনগুলি দেখতে পাচ্ছে না এবং অন্যান্য ব্যবহারকারীর অ্যাক্সেস নেই /proc/*/environ। অবশ্যই আপনার নিজের সিস্টেমে পরীক্ষা করুন।


8

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

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

নোট করুন যে এই সেটিংটি শেল কমান্ড লাইনগুলিকে সরাসরি সমর্থন করে না। শেল কমান্ড লাইনগুলি ব্যবহার করতে হলে এগুলি কোনও ধরণের শেল প্রয়োগের জন্য স্পষ্টভাবে প্রেরণ করা প্রয়োজন।

আমাদের ক্ষেত্রে উদাহরণটি হ'ল:

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

7
এটি একাধিক কারণে কাজ করবে না (যদি না এটি "ওয়ান-শট" পরিষেবা, যা অর্থহীন)। আমি কাজ করার জন্য নিম্নলিখিত পেতে পরিচালিত ছিল: /bin/bash -a -c 'source /etc/sysconfig/whatever && exec whatever-program'-aনিশ্চিত পরিবেশ উপ-প্রক্রিয়া রপ্তানি করা হয় (যতক্ষণ না আপনি সমস্ত ভেরিয়েবল প্রিফিক্স চান whateverসঙ্গে export)
Otheus

কেন এটি কাজ করবে না? এটি সর্বদা সম্পূর্ণ কমান্ডকে ট্রিগার করা উচিত যাতে স্ক্রিপ্টটি কার্যকর করা অন্তর্ভুক্ত থাকে, তাই না?
ব্যবহারকারী 1830432

ExecStart=/usr/bin/env ENV=script /bin/myforegroundcmdএক্ষেত্রে সম্ভবত আরও ভাল সমাধান হতে পারে ।
কেএসটিপ

@ ওথিয়াস: দুর্দান্ত উত্তর, দিনের বেলা সেভ হয়েছিল যখন আমাকে টমক্যাট 8 ইউনিট ফাইল তৈরি করতে হয়েছিল।
ড্যানিয়েল

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