EQVPS

چگونه یک سرویس systemd بسازیم تا اپلیکیشن دائم اجرا بماند

هر اسکریپت یا اپلیکیشنی را به یک سرویس مدیریت‌شده تبدیل کنید که هنگام بوت شروع می‌شود، پس از کرش دوباره راه می‌افتد و در journalctl لاگ می‌گیرد. یک فایل واحد بنویسید، فعالش کنید و وضعیتش را ببینید — روش استاندارد اجرای چیزی به‌صورت ۲۴/۷ در لینوکس.

اجرای یک اپلیکیشن با & یا 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، WorkingDirectory و User را متناسب با اپلیکیشن‌تان تنظیم کنید. Restart=always همان چیزی است که زنده نگهش می‌دارد.

۲. یک کاربر اختصاصی بسازید (توصیه‌شده)

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

اجرا با کاربری غیرروت آسیب را محدود می‌کند اگر روزی به اپلیکیشن نفوذ شود.

۳. فعالش کنید و شروعش کنید

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 همان راهی است که چیزی را ۲۴/۷ اجرا نگه می‌دارید — برای مثال یک عامل هوش مصنوعی که شبانه‌روز کار می‌کند یا رله‌ی پشت یک سرور RustDesk خودمیزبان. اگر اپلیکیشن‌تان به‌جای آن در کانتینر است، --restart unless-stopped در Docker همان نقش را بازی می‌کند — چگونه Docker را نصب کنیم را ببینید.

پرسش‌های متداول

چرا systemd به‌جای اجرای ساده اپلیکیشن در پس‌زمینه؟

یک پروسه‌ی پس‌زمینه (با & یا nohup) هنگام ری‌بوت می‌میرد، پس از کرش بازنمی‌گردد و لاگ‌هایش را پراکنده می‌کند. یک سرویس systemd هنگام بوت خودکار شروع می‌شود، در صورت شکست دوباره راه می‌افتد و خروجی‌اش را به journalctl می‌فرستد. این روش استاندارد و قابل‌اعتماد اجرای چیزی طولانی‌مدت در لینوکس است.

فایل‌های واحد کجا می‌روند؟

سرویس‌های خودتان در /etc/systemd/system/ می‌روند، یک فایل برای هر سرویس، با نامی مثل something.service. پس از ساخت یا ویرایش، 'systemctl daemon-reload' را اجرا کنید تا systemd تغییر را بردارد، سپس فعالش کنید و شروعش کنید.

‏'Restart=always' چه می‌کند و آیا معایبی دارد؟

به systemd می‌گوید هر بار که سرویس به هر دلیلی خارج شد، آن را دوباره راه بیندازد — کلید زنده نگه داشتن چیزی. تنها دام، حلقه‌ی کرش است: اگر اپلیکیشن هنگام شروع فوراً شکست بخورد، systemd پیوسته دوباره راهش می‌اندازد. 'RestartSec=5' را اضافه کنید تا تلاش‌ها فاصله بگیرند و لاگ‌ها را ببینید تا خطای بنیادی را رفع کنید.

چگونه لاگ‌های سرویس را ببینم؟

از 'journalctl -u yourservice -f' برای دنبال کردن خروجی زنده، یا بدون -f برای خواندن تاریخچه استفاده کنید. systemd خودکار stdout و stderr را می‌گیرد، پس نیازی نیست خودتان فایل لاگ راه بیندازید.

آیا سرویس باید با root اجرا شود؟

ترجیحاً نه. یک کاربر اختصاصی غیرروت بسازید و 'User=' را در واحد تنظیم کنید، تا نفوذ به اپلیکیشن کل دستگاه را تحویل ندهد. فقط وقتی سرویس واقعاً به آن نیاز دارد با root اجرا کنید.

نظرات

هنوز نظری نیست. اولین نفر باشید.

یک نظر بگذارید

نظرات پیش از نمایش بررسی می‌شوند.