systemd چیه و چطور سرویس بسازیم؟
systemd مدیر سیستم و سرویس ها توی لینوکسه اولین پروسه ای هست که موقع بوت شدن سرور اجرا میشه و مسئول راه اندازی همه سرویس ها و مدیریتشونه
systemd چیکار میکنه؟
- راه اندازی سرویس ها
وقتی سرور بوت میشه systemd تک تک سرویس ها رو به ترتیب راه میندازه میدونه Nginx باید بعد از Network راه بیفته PHP بعد از Nginx و الی آخر
- مدیریت وضعیت سرویس ها
یه سرویس رو میتونی استارت کنی استاپ کنی ریستارت کنی یا وضعیتش رو ببینی
- راه اندازی مجدد خودکار
اگه سرویسی بخوابه یا کرش کنه systemd میتونه خودکار دوباره راهش بندازه
- لاگ گیری
تمام لاگهای سرویس ها رو جمع میکنه و با دستور journalctl میتونی ببینیشون
- زمان بندی و وابستگی
میتونی تعریف کنی یه سرویس بعد از یه سرویس دیگه راه بیفته یا قبل از فلان سرویس استاپ بشه
Unit چیه؟
توی systemd هر چیزی یه Unit هست سرویس ها سوکت ها تایمرها دستگاه ها و... همه Unit هستن هر Unit یه فایل متنی سادست که توش مشخص شده چطور باید اجرا بشه
انواع Unit:
service. : یه سرویس یا برنامه
socket. : یه سوکت برای ارتباط
timer. : یه تایمر مثل cron
target. : یه گروه از Unit ها
mount. : یه نقطه اتصال فایل سیستم
یه سرویس ساده بسازیم
فرض کن یه اسکریپت پایتون داری که میخوای همیشه توی بکگراند اجرا بشه فایل رو بذار توی /opt/myapp/app.py
مرحله ۱: ساخت فایل سرویس
توی مسیر /etc/systemd/system/ یه فایل با اسم myapp.service بساز:
[Unit] Description=app name After=network.target [Service] Type=simple User=myuser WorkingDirectory=/opt/myapp ExecStart=/usr/bin/python3 /opt/myapp/app.py Restart=always RestartSec=5 [Install] WantedBy=multi-user.target
مرحله ۲: reload کردن systemd
sudo systemctl daemon-reload
مرحله ۳: استارت و فعال سازی سرویس
sudo systemctl start myapp sudo systemctl enable myapp
الان سرویس اجرا میشه و بعد از هر ریبوت خودکار راه میافته
توضیح بخشهای فایل سرویس
[Unit]
Description: توضیح کوتاه درباره سرویس
After: بگو این سرویس بعد از چی راه بیفته (مثلا network.target یعنی بعد از شبکه)
[Service]
Type: نوع سرویس simple یعنی یه برنامه ساده که توی foreground اجرا میشه
User: با کدوم کاربر اجرا بشه (root نباشه بهتره)
WorkingDirectory: مسیر کاری سرویس
ExecStart: دستوری که سرویس رو اجرا میکنه
Restart: کی ریستارت بشه (always یعنی همیشه on-failure یعنی فقط وقتی کرش کنه)
RestartSec: چند ثانیه صبر کنه بعد ریستارت
[Install]
WantedBy: توی کدوم Target فعال بشه (multi-user.target یعنی حالت عادی بدون GUI)
دستورات پرکاربرد systemctl
استارت سرویس
sudo systemctl start myapp
استاپ سرویس
sudo systemctl stop myapp
ریستارت سرویس
sudo systemctl restart myapp
وضعیت سرویس
sudo systemctl status myapp
فعالسازی برای اجرا در بوت
sudo systemctl enable myapp
غیرفعالسازی از بوت
sudo systemctl disable myapp
دیدن لاگهای سرویس
sudo journalctl -u myapp
دیدن لاگهای زنده (لحظه ای)
sudo journalctl -u myapp -f
لیست همه سرویس ها
sudo systemctl list-units --type=service
لیست سرویس های فعال
sudo systemctl list-units --type=service --state=running
reload بعد از تغییر فایل ها
sudo systemctl daemon-reload