اجرای یک اپلیکیشن با & یا 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 # از راهاندازی هنگام بوت درآور
هشدارهای صادقانه
- پس از ویرایش فایل واحد
daemon-reloadرا اجرا کنید، وگرنه systemd از نسخهی قدیمی استفاده میکند. - مراقب حلقههای کرش باشید. اگر اپلیکیشن فوراً شکست بخورد،
Restart=alwaysتا ابد تلاش میکند —RestartSec=5تلاشها را فاصله میدهد؛ خطای ریشهای را از طریق لاگها رفع کنید. User=غیرروت را ترجیح دهید تا یک اپلیکیشن نفوذشده مالک کل سرور نشود.
گامهای بعدی
سرویس systemd همان راهی است که چیزی را ۲۴/۷ اجرا نگه میدارید — برای مثال یک عامل هوش مصنوعی که شبانهروز کار میکند یا رلهی پشت یک سرور RustDesk خودمیزبان. اگر اپلیکیشنتان بهجای آن در کانتینر است، --restart unless-stopped در Docker همان نقش را بازی میکند — چگونه Docker را نصب کنیم را ببینید.
نظرات
هنوز نظری نیست. اولین نفر باشید.