EQVPS

অ্যাপ চালু রাখতে systemd সার্ভিস কীভাবে তৈরি করবেন

যেকোনো স্ক্রিপ্ট বা অ্যাপকে একটি পরিচালিত সার্ভিসে রূপান্তর করুন যা বুটে শুরু হয়, ক্র্যাশ করলে পুনরায় চালু হয়, এবং journalctl-এ লগ রাখে। একটি ইউনিট ফাইল লিখুন, সক্রিয় করুন, এবং এর স্ট্যাটাস দেখুন — Linux-এ কিছু ২৪/৭ চালানোর মানক উপায়।

অ্যাপকে & বা nohup দিয়ে চালানো ঠিক আছে — যতক্ষণ না সার্ভার রিবুট হয়, প্রসেস ক্র্যাশ করে, বা আপনি তার লগ খুঁজতে চান — তখন সব ভেঙে পড়ে। systemd হলো মানক উত্তর: এটি বুটে আপনার অ্যাপ শুরু করে, মরলে পুনরায় চালু করে, এবং তার লগ ধরে। একটি স্ক্রিপ্ট বা বাইনারিকে পরিচালিত সার্ভিসে রূপান্তর করা একটি ছোট ফাইলের ব্যাপার।

১. একটি ইউনিট ফাইল লিখুন

/etc/systemd/system/myapp.service তৈরি করুন:

[Unit]
Description=My application
After=network.target

[Service]
User=myapp
WorkingDirectory=/opt/myapp
ExecStart=/usr/bin/python3 /opt/myapp/run.py
Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target

ExecStart, WorkingDirectoryUser আপনার অ্যাপ অনুযায়ী সমন্বয় করুন। Restart=always হলো যা একে জীবিত রাখে।

২. একটি নিবেদিত ব্যবহারকারী তৈরি করুন (সুপারিশকৃত)

sudo useradd --system --no-create-home --shell /usr/sbin/nologin myapp
sudo chown -R myapp:myapp /opt/myapp

non-root ব্যবহারকারী হিসেবে চালানো অ্যাপ কখনো আপস হলে ক্ষতি সীমিত করে।

৩. এটি সক্রিয় করুন এবং শুরু করুন

sudo systemctl daemon-reload
sudo systemctl enable --now myapp

enable একে বুটে শুরু করায়; --now এখনই শুরু করে।

৪. স্ট্যাটাস ও লগ দেখুন

sudo systemctl status myapp
journalctl -u myapp -f       # সরাসরি লগ অনুসরণ করুন

দৈনন্দিন কমান্ড

sudo systemctl restart myapp   # পরিবর্তনের পর পুনরায় চালু করুন
sudo systemctl stop myapp      # থামান
sudo systemctl disable myapp   # বুটে শুরু হওয়া বন্ধ করুন

সৎ সতর্কবার্তা

পরবর্তী ধাপ

systemd সার্ভিস হলো যেভাবে আপনি যেকোনো কিছু ২৪/৭ চালু রাখেন — উদাহরণস্বরূপ চব্বিশ ঘণ্টা চলা একটি AI এজেন্ট বা সেল্ফ-হোস্টেড RustDesk সার্ভার-এর পেছনের রিলে। আপনার অ্যাপ বরং কনটেইনারাইজড হলে, Docker-এর --restart unless-stopped একই ভূমিকা পালন করে — দেখুন Docker কীভাবে ইনস্টল করবেন

FAQ

অ্যাপকে শুধু পটভূমিতে চালানোর বদলে কেন systemd?

পটভূমির একটি প্রসেস (& বা nohup দিয়ে) রিবুটে মরে যায়, ক্র্যাশ করলে ফিরে আসে না, এবং তার লগ ছড়িয়ে দেয়। একটি systemd সার্ভিস বুটে স্বয়ংক্রিয়ভাবে শুরু হয়, ব্যর্থতায় পুনরায় চালু হয়, এবং তার আউটপুট journalctl-এ পাঠায়। Linux-এ দীর্ঘজীবী কিছু চালানোর এটিই মানক, নির্ভরযোগ্য উপায়।

ইউনিট ফাইল কোথায় রাখা হয়?

আপনার নিজের সার্ভিসগুলো /etc/systemd/system/-এ যায়, প্রতি সার্ভিসে একটি ফাইল, something.service-এর মতো নামে। তৈরি বা সম্পাদনার পর 'systemctl daemon-reload' চালান যাতে systemd পরিবর্তন ধরে, তারপর সক্রিয় করে শুরু করুন।

'Restart=always' কী করে, এবং এর অসুবিধা আছে কি?

এটি systemd-কে বলে যে কোনো কারণেই সার্ভিস প্রস্থান করলে তাকে পুনরায় চালু করতে — কিছু চালু রাখার চাবিকাঠি। একমাত্র ফাঁদ হলো ক্র্যাশ লুপ: অ্যাপ শুরুতেই তৎক্ষণাৎ ব্যর্থ হলে systemd তাকে বারবার পুনরায় চালু করতে থাকে। চেষ্টাগুলোর মধ্যে ব্যবধান দিতে 'RestartSec=5' যোগ করুন, এবং মূল ত্রুটি ঠিক করতে লগ দেখুন।

সার্ভিসের লগ কীভাবে দেখব?

সরাসরি আউটপুট অনুসরণ করতে 'journalctl -u yourservice -f', বা ইতিহাস পড়তে -f ছাড়া ব্যবহার করুন। systemd stdout ও stderr স্বয়ংক্রিয়ভাবে ধরে, তাই নিজে লগ ফাইল যুক্ত করার দরকার নেই।

সার্ভিস কি root হিসেবে চলা উচিত?

বরং না। একটি নিবেদিত non-root ব্যবহারকারী তৈরি করুন এবং ইউনিটে 'User=' সেট করুন, যাতে অ্যাপের আপস পুরো মেশিন তুলে না দেয়। সার্ভিসের সত্যিই দরকার হলে তবেই root হিসেবে চালান।

মন্তব্য

এখনো কোনো মন্তব্য নেই। প্রথম হোন।

একটি মন্তব্য দিন

মন্তব্য প্রকাশের আগে মডারেট করা হয়।