Systemctl ব্যবহার করে Linux-এ Systemd সার্ভিস ম্যানেজমেন্ট
জনপ্রিয় লিনাক্স ডিস্ট্রোদের অধিকাংশ (CentOS, RHEL, Debian, Fedora, এবং Ubuntu) init.d-এর পরিবর্তে systemd স্টার্টআপ ডيمون ব্যবহার করে। Systemd হলো একটি লিনাক্স সার্ভিস ম্যানেজার যা অন্যান্য ডিমনগুলো শুরু এবং পরিচালনা করতে ব্যবহৃত হয়। এটি /etc/systemd/system থেকে ইউনিট ফাইল ব্যবহার করে (init.d /etc/init.d/ থেকে স্ক্রিপ্ট ব্যবহার করত)। Systemd OS বুটের সময় সার্ভিস স্টার্টআপকে প্যারাালেল করতে দেয়।
Systemd ম্যানেজ করার জন্য systemctl কমান্ড ব্যবহার করা হয়।
সিস্টেম বুট হওয়ার পর, প্রথমে systemd-এ উপলব্ধ ইউনিটের তালিকা চেক করুন:
systemctl list-units
ইউনিট ফাইলগুলির তালিকা পেতে এই কমান্ডটি ব্যবহার করুন:
systemctl list-unit-files
এই কমান্ডটি সকল উপলব্ধ ইউনিট ফাইল প্রদর্শন করবে।
সক্রিয় সার্ভিসগুলোর তালিকা এবং তাদের অবস্থা দেখতে এই কমান্ডটি চালান:
# systemctl list-units -t service
যেহেতু কিছু ইউনিট স্টার্টআপের পর ইনएक্টিভ হতে পারে, আপনি --all অপশন ব্যবহার করে পূর্ণ তালিকা পেতে পারেন।
# systemctl list-units --all
তালিকাটি থেকে দেখা যায়, ডিস্কে না পাওয়া সার্ভিসগুলোর জন্যও প্রদর্শিত হয়।
আপনি কিছু অন্যান্য ফ্ল্যাগও ব্যবহার করতে পারেন, যেমন:
- --state — ডিমন স্টেট শনাক্ত করতে: Load, Active, Sub
- --type — ইউনিট টাইপ অনুযায়ী ফিল্টার করতে দেয়
উদাহরণ:
systemctl list-units --all --state=active — শুধু সক্রিয় systemd ইউনিটগুলো প্রদর্শন করবে
systemctl list-units --type=service — সার্ভিস হিসেবে یونিটগুলোর তালিকা প্রদর্শন করবে
Systemd-এ সার্ভিস তৈরি কিভাবে করবেন?
সার্ভিস ম্যানেজ করার জন্য systemd একটি বিশেষ সিনট্যাক্স ব্যবহার করে। সার্ভিসের নামের পর .service যোগ করতে হবে। উদাহরণস্বরূপ:
# systemctl enable nginx.service — এই কমান্ড nginx ওয়েব সার্ভারকে স্টার্টআপে যোগ করে
এই কমান্ড systemd স্টার্টআপ ডিরেক্টরিতে সার্ভিস কমান্ডে নির্দিষ্ট ফাইলের একটি সিমবোলিক লিংক তৈরি করে।
# systemctl enable nginx.service
Created symlink from /etc/systemd/system/multi-user.target.wants/nginx.service to /usr/lib/systemd/system/nginx.service
আউটপুটে সিমলিংক তৈরি হওয়ার ডিরেক্টরি দেখায়।
একটি সার্ভিস স্টার্টআপে যোগ হয়েছে কিনা চেক করতে এর স্ট্যাটাস পেতে পারেন:
systemctl status nginx.service
আউটপুটে নিচের লাইনটি লক্ষ্য করুন:
Loaded: loaded (/usr/lib/systemd/system/nginx.service; enabled; vendor preset: disabled)
enabled মান বোঝায় যে এই সার্ভিসটি লিনাক্স স্টার্টআপে যোগ করা হয়েছে। যদি সার্ভিসটি স্বয়ংক্রিয়ভাবে শুরু না হয়, তবে এখানে disabled দেখাবে।
Systemd-এ সার্ভিস ডিজেবল কিভাবে করবেন?
আপনি একটি সার্ভিসকে স্টার্টআপ থেকে সরিয়ে ফেলতে পারেন যাতে এটি লিনাক্স বুটের সময় স্বয়ংক্রিয়ভাবে শুরু না হয় (যদিও সার্ভিসটি নিজে মুছে যাবে না)। সার্ভিসের অটোস্টার্টআপ ডিজেবল করতে নিচের কমান্ডটি চালান:
# systemctl disable your_service
উদাহরণস্বরূপ, nginx অটোস্টার্টআপ ডিজেবল করতে:
# systemctl disable nginx.service
Removed symlink /etc/systemd/system/multi-user.target.wants/nginx.service
এটি করার পর সার্ভিস ফাইলের সিমলিংক systemd ডিরেক্টরি থেকে মুছে যাবে। আপনি নিশ্চিত করতে পারেন যে সার্ভিসটি স্বয়ংক্রিয়ভাবে শুরু হয় কিনা:
# systemctl is-enabled nginx
Systemd-এ ইউনিট মাস্ক কিভাবে করবেন?
আমি কিছু অসাধু সার্ভিসের সম্মুখীন হয়েছি যা ডিজেবল করার পরও স্টার্টআপে থাকত এবং লিনাক্স রিবুটের পর শুরু হত। এই সমস্যাটি সমাধান করতে আপনি একটি সার্ভিস মাস্ক করতে পারেন:
# systemctl mask nginx.service
তब এটি ম্যানুয়ালি বা OS রিস্টার্টের পরও শুরু হবে না:
# systemctl mask nginx.service
Created symlink from /etc/systemd/system/nginx.service to /dev/null.
# service nginx restart
Redirecting to /bin/systemctl restart nginx.service Failed to restart nginx.service: Unit is masked.
আপনি এই কমান্ড দিয়ে সার্ভিস আনমাস্ক করতে পারেন:
# systemctl unmask nginx.service
Removed symlink /etc/systemd/system/nginx.service.
যদি একটি সার্ভিস মাস্ক করার পর আপনার ইউনিট ফাইল চেক করেন, তবে দেখবেন সার্ভিসটি masked হিসেবে চিহ্নিত হয়েছে।
Rc.local দিয়ে স্ক্রিপ্ট বা সার্ভিস চালান
লিনাক্স বুটে বিভিন্ন স্ক্রিপ্ট চালানোর জন্য rc.local প্রায়শই ব্যবহৃত হয়।
স্ক্রিপ্টের পাশাপাশি, rc.local ব্যবহার করে সার্ভিসও চালানো যায়, এমনকি যেগুলো systemd ব্যবহার করে শুরু হয়। আমি না জানি systemd থাকার পরেও কেন rc.local ব্যবহার করা উচিত, কিন্তু এখানে কয়েকটি উদাহরণ দিচ্ছি।
প্রথমে, /etc/rc.local এক্সিকিউটেবল হতে হবে:
chmod +x /etc/rc.local
Rc.local-কে systemd অটোস্টার্টে যোগ করতে হবে:
systemctl enable rc-local
এবং আমরা rc.local-এ nginx ওয়েব সার্ভার শুরু করার কমান্ড যোগ করতে পারি:
service nginx start
কিন্তু আমি সার্ভিস শুরু করার জন্য খুব কম rc.local ব্যবহার করি। বেশিतर rc.local ব্যবহার করা হয় একটি স্ক্রিপ্ট বা কমান্ড একবার চালানোর জন্য।
উদাহরণস্বরূপ, আমি একটি স্ক্রিপ্ট /root/test.sh তৈরি করেছিলাম যা কিছু কাজ করে এবং আমি চাই বুটের সাথে সাথে এটি চালানো হয়। rc.local ফাইলে নিচের লাইনটি যোগ করুন:
sh /root/test.sh
CentOS 7 থেকে ডেভেলপাররা নির্দেশ করেছেন যে rc.local একটি প্রচলনবাহী ডিমন এবং এটি স্ক্রিপ্ট বা সার্ভিস শুরু করার জন্য প্রস্তাবিত নয়। কিন্তু আমি এটি ব্যবহার করি যতক্ষণ এটি কাজ করছে, কারণ এটি খুব সহজ।
Systemd দিয়ে লিনাক্স সার্ভিস তৈরি কিভাবে করবেন?
আপনি নিজের ডিমন তৈরি করতে পারেন এবং এটিকে systemd মাধ্যমে ম্যানেজ করতে পারেন।
উদাহরণস্বরূপ, আপনি চান একই স্ক্রিপ্ট (/root/test.sh) সিস্টেম রিবুট হওয়ার 때마다 চালানো হয়। আমাদের নতুন সার্ভিসের ফাইল তৈরি করি:
touch /etc/systemd/system/test-script.service
chmod 664 /etc/systemd/system/test-script.service
nano /etc/systemd/system/test-script.service
ফাইলের কন্টেন্ট হবে:
[Unit] Description=Template Settings Service After=network.target [Service] Type=oneshot User=root ExecStart=/root/test.sh [Install] WantedBy=multi-user.target
প্রধান প্যারামিটারগুলো:
User— যে ইউজার অ্যাকাউন্ট থেকে ডিমন শুরু হবেType=oneshot— systemd প্রক্রিয়া শেষ হওয়ার জন্য অপেক্ষা করবে তারপর অন্যান্য ইউনিটের সাথেשך করবে
চেক এবং রিস্টার্ট করুন:
# systemctl daemon-reload
# systemctl start test-script.service
# systemctl status test-script.service
● test-script.service - Test Loaded: loaded (/etc/systemd/system/test-script.service; disabled; vendor preset: disabled) Active: active (running)
যদি সার্ভিসটি ভালোভাবে কাজ করে, তবে এটিকে systemd স্টার্টআপে যোগ করুন:
# systemctl enable test-script.service
Created symlink from /etc/systemd/system/multi-user.target.wants/test-script.service to /etc/systemd/system/test-script.service.
এভাবে আপনি যেকোনো স্ক্রিপ্টকে অটোস্টার্টে যোগ করতে পারেন এবং systemd-এর মাধ্যমে তাদের ম্যানেজ করতে পারেন।
Cron ব্যবহার করে স্ক্রিপ্ট চালানোর পদ্ধতি
আপনি যদি একটি স্ক্রিপ্ট বা কমান্ড নির্দিষ্ট ফ্রিকোয়েন্সিতে চালাতে চান, তবে cron ব্যবহার করতে পারেন:
crontab -e — ক্রন টাস্ক টেবিল পরিবর্তন করার জন্য এডিটর খোले
এখানে আপনার পছন্দের টাস্ক যোগ করুন, উদাহরণস্বরূপ:
* * * * * /root/test.sh — প্রতি মিনিটে একবার স্ক্রিপ্ট চালাবে
আপনি একটি watch-dog স্ক্রিপ্ট লিখতে পারেন যা সার্ভিসের স্ট্যাটাস চেক করবে, এবং যদি সার্ভিস চলছে না, তবে স্ক্রিপ্টটি সেটিকে শুরু করবে। আমি আমার কিছু প্রজেক্টে অনুরূপ পদ্ধতি ব্যবহার করি।
ক্রনে সকল টাস্কের তালিকা দেখতে এই কমান্ডটি চালান:
# crontab -l
* * * * * /root/test.sh
ক্রন টাস্ক চালানোর জন্য উপলব্ধ টাইম ভ্যালুগুলো ক্রমে:
- মিনিট: 0-59
- ঘণ্টা: 0-23
- মাসের দিন: 1-31
- মাস: 1-12
- সপ্তাহের দিন: 0-7 (0 বা 7 হলো রবিবার)
আমাদের টাস্কে, স্ক্রিপ্টটি প্রতি মিনিটে একবার চালানো হয়, তাই সেখানে *অ্যাস্টারিস্ক* আছে।
আপনি স্ক্রিপ্টটি cron ডিরেক্টরিগুলোর একটি tempat করতে পারেন:
- /cron.daily — প্রতিদিন একবার চালানোর জন্য স্ক্রিপ্ট
- /cron.hourly — প্রতি ঘণ্টে একবার চালানোর জন্য স্ক্রিপ্ট
- /cron.monthly — প্রতি মাসে একবার চালানোর জন্য স্ক্রিপ্ট
- /cron.weekly — প্রতি সপ্তাহে একবার চালানোর জন্য স্ক্রিপ্ট
নির্দিষ্ট ডিরেক্টরিতে থাকা স্ক্রিপ্টগুলো স্বয়ংক্রিয় সময়সূচী অনুযায়ী চালানো হবে।
Bash স্টার্টআপ স্ক্রিপ্ট: .bashrc
আপনি যদি SSH কনসোল শুরু করার সময় কিছু অ্যাকশন সম্পাদন করতে চান, তবে আপনি যেকোনো কমান্ড বা স্ক্রিপ্ট .bash_profile বা .bashrc ফাইলে যোগ করতে পারেন। তত্ত্ব অনুযায়ী, আপনি এই ফাইলগুলোর যেকোনো একটিতে অ্যাকশন যোগ করতে পারেন, যাহা চাইলে চলবে। সাধারণত, প্রয়োজনীয় জিনিসগুলো .bashrc-এ যোগ করা হয়, এবং .bashrc .bash_profile থেকে শুরু হয়।
আমি .bashrc ফাইলে nginx ওয়েব সার্ভিস রিস্টার্ট করার কমান্ড যোগ করেছিলাম:
service nginx restart
তারপর ফাইলটি সংরক্ষণ করে SSH সেশন রিস্টার্ট করলাম:
আপনি দেখতে পাচ্ছেন, টার্মিনাল শুরু হওয়ার সাথে সাথে ওয়েব সার্ভারও রিস্টার্ট হয়েছে। টার্মিনাল শুরু হওয়ার সময় কী কী অ্যাকশন করা যেতে পারে? এটি কিছু এক্সট্রা টুল হতে পারে, যেমন uptime সার্ভার চেক:
অথবা আপনি যদি SSH কনসোল চালানোর সময় নির্দিষ্ট ডিরেক্টরিতে যেতে চান এবং mc শুরু করতে চান, তবে .bashrc-এ নিচের কোডটি যোগ করুন:
cd /var/
mc
আশা করি লিনাক্সে সার্ভিস বা স্ক্রিপ্ট স্টার্টআপ ম্যানেজ করার এই আর্টিকেলটি আপনার জন্য উপকারী হয়েছে (এই আর্টিকেলটি CentOS এবং RHEL-এর জন্য লিখা 되었지만, অন্যান্য ডিস্ট্রোর জন্যও উপযুক্ত)। আমি নিশ্চিত যে এই তথ্যটি লিনাক্স সিস্টেম অ্যাডমিনিস্ট্রেশনের বেসিক্স শিখছে লোকদের জন্য খুব কাজের হবে।