আমি কীভাবে নির্দিষ্ট সিস্টেমের মাধ্যমে আমার সিস্টেমেড পরিষেবাটি চালাচ্ছি এবং বুট শুরু করব?


132

আমি সবেমাত্র উবুন্টু সার্ভার 14 থেকে সংস্করণ 15 এ আপগ্রেড করেছি the আপগস্টের পরে আমার আপস্টার্ট স্ক্রিপ্টটি কাজ করতে সমস্যা হয়েছে এবং পড়তে হবে যে সিস্টেমডই নতুন ডিফল্ট। আমি একটি লিনাক্স বিশেষজ্ঞের থেকে অনেক দূরে, সুতরাং দয়া করে আমার উপর সহজ যান :-)

আমার আপস্টার্ট স্ক্রিপ্টটি যা ছিল তা এখানে:

description "NZBGet upstart script"

setuid robert
setgid robert

start on runlevel [2345]
stop on runlevel [016]

respawn

expect fork

script
    exec nzbget -D
end script

pre-stop script
    exec nzbget -Q
end script

সিস্টেমযুক্ত উইকির পৃষ্ঠার উপর ভিত্তি করে আমি আমার নতুন সিস্টেমেড সার্ভিস ফাইলে যতটা পারি তার কাছ থেকে জিনিসগুলি ম্যাপ করার জন্য সেখানে প্রদত্ত টেবিলগুলি ব্যবহার করেছি:

[Unit]
Description=NZBGet Service

[Service]
Type=forking
ExecStart=/usr/local/bin/nzbget -D
ExecStop=/usr/local/bin/nzbget -Q
Restart=on-failure

এই ফাইলটি অবস্থিত /home/robert/.config/systemd/user/nzbget.service। ম্যানুয়ালি পরিষেবা শুরু করতে, আমি করছি:

$ systemctl --user start nzbget

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

এই কনফিগারেশনটি পেতে আমার কী করা দরকার?

উত্তর:


163

প্রথম সমস্যা

আপনি নির্দেশনা নির্দিষ্ট করতে পারেন User=এবং Group=[Service]ইউনিট ফাইলের অধ্যায়।

দ্বিতীয় সমস্যা

বুটটি চালানোর জন্য পরিষেবাটি আপনার হোম ফোল্ডারে রাখা উচিত নয়। পরিবর্তে, এটি অধীনে রাখুন /etc/systemd/system/। সিস্টেম অ্যাডমিনিস্ট্রেটর (যেমন আপনি) দ্বারা নতুন সিস্টেম-ব্যাপী পরিষেবা যুক্ত করার জন্য ব্যবহৃত ফোল্ডারটি এটি।

অন্যান্য ফোল্ডারগুলির মধ্যে রয়েছে:

  • /usr/lib/systemd/system/ইউনিট ফাইলগুলি ইনস্টল করতে চায় এমন প্যাকেজগুলির জন্যই বোঝানো হয়েছে, যদিও ডেবিয়ান এবং উবুন্টুর অধীনে ফোল্ডারটি হ'ল /lib/systemd/system/কারণ বিভিন্ন binএবং libফোল্ডারগুলি /usr/এখনও একটি ইউনিফাইড উপস্থায় একীভূত হয়নি।
  • /usr/local/systemd/system/ স্থানীয়ভাবে সংকলিত প্যাকেজগুলির মাধ্যমে ইউনিট ইনস্টল করার জন্য।

ইউনিট পরীক্ষা করা হচ্ছে

একবার ইউনিট ফাইলটি উপযুক্ত স্থানে থাকলে আপনি systemctl start <UNIT_FILENAME>যথারীতি যথারীতি টাইপ করে ইউনিটটি শুরু করার চেষ্টা করতে পারেন । ইউনিটের পুরো পথটি টাইপ না করে এটি কাজ করা উচিত। এক্সটেনশনটি যদি তা থাকে তবে তা নির্দিষ্ট করে দেওয়াও হয় না .service

ইউনিট সক্ষম করা হচ্ছে

আপনি নিজের ইউনিট সক্ষম করার আগে আপনাকে একটি [Install]বিভাগ যুক্ত করতে হবে , যার অধীনে আপনার নির্দেশিকা যুক্ত করা উচিত WantedBy=multi-user.target। এই নির্দেশিকাটি পরিষেবাটি শুরু করা উচিত (এইটি সক্ষম করা থাকলে) চলাকালীন বুট-আপ প্রক্রিয়াটির ধাপ নির্দিষ্ট করে। multi-user.targetবেশিরভাগ পরিষেবার জন্য উপযুক্ত।

তথ্যটি যুক্ত হয়ে গেলে, আপনি ব্যবহার করতে পারবেন systemctl enable <UNIT_FILENAME>যা ইউনিটকে সক্ষম করে, এখন থেকে সিস্টেমড তৈরি করে নির্দিষ্ট পর্যায়ে বুট আপ করার সময় এটি স্বয়ংক্রিয়ভাবে এটি শুরু করে।


এটি কাজ করে। systemctl enableকমান্ডে সার্ভিস ফাইল নামটির জন্য আমাকে পরম পথটি নির্দিষ্ট করতে হয়েছিল, যদিও এটি প্রথমে আমার কাছে স্পষ্ট ছিল না। সক্ষম করা আমাকে অনুপস্থিত [Install]বিভাগ সম্পর্কে কিছু সতর্কবার্তা দিয়েছে । আমি এটিকে উপেক্ষা করেছি, তবে আমি নিশ্চিত নই যে এটি বুটের সময় শুরু করার ক্ষমতাকে প্রভাবিত করবে কিনা।
void.pointer

2
Installসাবধানবাণী আসলে সত্যিই গুরুত্বপূর্ণ ছিল। এটি বিভাগের WantedBy=multi-user.targetঅধীনে বুট শুরু হবে না [Install]। এই যোগ করার পর .serviceফাইল, তারপর আপনি পারেন enableএটা।
void.pointer

4
এত দীর্ঘ সময়ের জন্য উত্তরটি অপ্রত্যাশিতভাবে ছেড়ে দেওয়ার বিষয়ে আমি ক্ষমা চাই। আমি ইউনিট ফাইলটি কোথায় যেতে হবে সেই অবস্থানটি স্থির করেছিলাম, [Install]বিভাগ সম্পর্কে অনুপস্থিত তথ্য যুক্ত করেছি । আশা করি যে কেউ এটির জন্য এখন এটি আরও সহায়ক।
ইয়ামাহো

5
এটি ব্যবহারকারীর নাম টেম্প্লেট করা হলে এটি অনেক সহজ হয়ে যায়, অর্থাত আপনার পরিষেবাটি কোনও ফর্ম্যাটতে ফাইলের নাম দিয়ে সংজ্ঞায়িত করা হয় something@.serviceতবে enableডি something@username.serviceসেটিংসের মতো হয়ে যায় User=%iযার অর্থ ব্যবহারকারী হার্ড-কোডড নয় এবং একাধিক ব্যবহারকারী একই সংজ্ঞা ব্যবহার করতে পারবেন। একটি উদাহরণ.
ওয়ালফ

1
আমি এটি নীচে রাখলে এটি শুরু হবে /etc/systemd/user/?
খুরশিদ আলম

46

আপনি সিস্টেমডির "ব্যবহারকারী দীর্ঘতর" কার্যকারিতা ব্যবহারে আগ্রহী হতে পারেন। এটি মাধ্যমে সক্ষম করা হয়েছে loginctl enable-linger USERNAME

এটি সম্পর্কিত ব্যবহারকারীদের বুট-এ শুরু হওয়ার জন্য পৃথক পরিষেবা পরিচালকের কারণ ঘটায়, সুতরাং আপনার ব্যবহারকারী-সংজ্ঞায়িত ইউনিটগুলি ~/.config/systemd/userআপনার পরিষেবা কনফিগারেশন অনুযায়ী বুট এবং শাটডাউন সময়ে বেছে নেওয়া হবে এবং প্রক্রিয়া করা হবে।

আপনি systemctl --userপরিষেবা (গুলি) পরিচালনা ও কনফিগার করার জন্যও ব্যবহার করতে পারেন , যা আপনার ব্যবহারকারীর পরিষেবা পরিচালকের উপর পরিচালিত হবে, সিস্টেমের মধ্যে নয়।


6
systemctl --userএকটি চমত্কার অনুসন্ধান। ধন্যবাদ!
আনোয়ার

@byteborg হতে পারে আপনি অবদান রাখতে পারেন unix.stackexchange.com/questions/409900/... ? ব্যবহারকারী লম্বারিং পরিষেবাতে পোস্টগ্রিএসকিউএল-এর উপর আমার নির্ভরতা প্রয়োজন, তবে ডাটাবেসটি সিস্টেম সার্ভিস, ব্যবহারকারীর মতো নয় remains
Michał F

1
একবার পরিষেবাদিগুলি চালু হয়ে যাওয়ার পরে, এমন কোনও কৌশল রয়েছে যা ব্যবহারকারীকে সেবার লগগুলি দেখতে দেয়? একটি অনিবদ্ধ ব্যবহারকারী / var / লগ / syslog এ যেতে সক্ষম হবেন না।
এমআরপি

2
মনে রাখবেন যে systemctl --userযদিও এসএসএইচ সেশনের জন্য কাজ করে না।
কে কে কোয়ান

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