با دستورات systemctl سرویسهای لینوکس را شروع، متوقف و ریاستارت میکنید و تعیین میکنید بعد از بوت خودکار بالا بیایند یا نه. با journalctl لاگ آنها را میخوانید. این دو مهمترین ابزار مدیر سرور در توزیعهای مدرن مثل Ubuntu، Debian، AlmaLinux و Rocky هستند، چون همه این توزیعها systemd را بهعنوان سیستم راهاندازی به کار میبرند.
در این راهنما دستورهای روزمره را با مثال میآوریم و در انتها نشان میدهیم چطور سرویسی که بالا نمیآید را عیبیابی کنید. برای ساخت زمانبندی با systemd timer هم آموزش Cron Job در لینوکس را ببینید.
مفهوم unit
systemd هر چیزی را که مدیریت میکند یک unit مینامد. مهمترین انواع آن: service برای سرویسها مثل nginx.service، timer برای کارهای زمانبندیشده، socket برای سوکتها و target برای گروههایی از unitها که وضعیت سیستم را مشخص میکنند، مثل multi-user.target. هنگام نوشتن دستور، پسوند .service اختیاری است: systemctl status nginx و systemctl status nginx.service یکیاند.
دستورات systemctl برای مدیریت سرویسها
| کار | دستور |
|---|---|
| دیدن وضعیت | systemctl status nginx |
| شروع | sudo systemctl start nginx |
| توقف | sudo systemctl stop nginx |
| ریاستارت کامل | sudo systemctl restart nginx |
| خواندن دوباره کانفیگ بدون قطع | sudo systemctl reload nginx |
| فعال شدن در بوت | sudo systemctl enable nginx |
| غیرفعال شدن در بوت | sudo systemctl disable nginx |
| فعال و شروع همزمان | sudo systemctl enable --now nginx |
| بررسی فعال بودن | systemctl is-active nginx |
| بررسی فعال در بوت | systemctl is-enabled nginx |
start و stop فقط وضعیت فعلی را عوض میکنند، ولی enable و disable تعیین میکنند بعد از ریاستارت سرور چه اتفاقی بیفتد. اگر سرویسی را فقط start کرده باشید و enable نکرده باشید، بعد از ریاستارت سرور بالا نمیآید. دستور reload فقط برای سرویسهایی کار میکند که از آن پشتیبانی میکنند؛ برای Nginx و PHP-FPM بله.
خواندن خروجی status
systemctl status nginxسه چیز در خروجی مهم است. خط Loaded نشان میدهد unit از کدام فایل خوانده شده و در بوت فعال است یا نه. خط Active وضعیت را نشان میدهد: active (running) یعنی در حال اجرا، inactive (dead) یعنی متوقف و failed یعنی شکست خورده. چند خط آخر لاگهای اخیر سرویس هستند و معمولاً علت خطا همانجا نوشته شده است.
فهرست سرویسها
systemctl list-units --type=service
systemctl list-units --type=service --state=failed
systemctl list-unit-files --type=serviceدستور دوم فقط سرویسهای شکستخورده را نشان میدهد و بعد از ریاستارت سرور اولین چیزی است که باید ببینید. دستور سوم همه فایلهای سرویس و وضعیت فعال بودن آنها را فهرست میکند.
خواندن لاگ با journalctl
لاگ سرویسهایی که با systemd اجرا میشوند، در journal جمع میشود:
| کار | دستور |
|---|---|
| لاگ یک سرویس | journalctl -u nginx |
| ۵۰ خط آخر | journalctl -u nginx -n 50 --no-pager |
| دنبال کردن زنده | journalctl -u nginx -f |
| از بوت فعلی | journalctl -b |
| از بوت قبلی | journalctl -b -1 |
| فقط خطاها | journalctl -p err |
| بازه زمانی | journalctl --since "2026-10-04 10:00" --until "2026-10-04 11:00" |
| لاگ هسته | journalctl -k |
| حجم journal | journalctl --disk-usage |
گزینه -p err سطح خطا و بالاتر را نشان میدهد. journalctl -u nginx -f مثل tail -f عمل میکند و برای دیدن لاگ هنگام تکرار خطا مفید است. برای دیدن اینکه چرا سرور بعد از یک ریاستارت ناگهانی بالا نیامده، journalctl -b -1 لاگ بوت قبلی را نشان میدهد.
محدود کردن حجم لاگ journal
در بعضی سرورها journal بهمرور فضای زیادی میگیرد. حجم فعلی را ببینید و بخش قدیمی را پاک کنید:
journalctl --disk-usage
sudo journalctl --vacuum-time=14d
sudo journalctl --vacuum-size=500Mبرای اینکه سقف همیشگی باشد، در فایل /etc/systemd/journald.conf مقدار SystemMaxUse=500M را بگذارید و سرویس systemd-journald را ریاستارت کنید. در بعضی توزیعها journal بهطور پیشفرض فقط در حافظه است و با ریاستارت پاک میشود؛ برای ماندن آن پوشه /var/log/journal باید وجود داشته باشد.
نوشتن سرویس سفارشی
برای اجرای یک برنامه یا اسکریپت بهصورت سرویس، فایل /etc/systemd/system/myapp.service را بسازید:
[Unit]
Description=My application
After=network-online.target
Wants=network-online.target
[Service]
User=appuser
WorkingDirectory=/opt/myapp
ExecStart=/opt/myapp/bin/myapp
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.targetبعد systemd را از فایل جدید باخبر و سرویس را فعال کنید:
sudo systemctl daemon-reload
sudo systemctl enable --now myappگزینه Restart=on-failure سرویس را بعد از خرابی بدون دخالت شما دوباره بالا میآورد. اجرای برنامه با یک کاربر غیر root (User=) از سادهترین کارهای امنیتی است. مسیرها و کاربر را در مثال با برنامه خودتان عوض کنید.
تغییر تنظیمات یک سرویس موجود
فایل سرویس بسته را مستقیم ویرایش نکنید، چون با بهروزرسانی بسته بازنویسی میشود. با override تغییر خودتان را جدا نگه دارید:
sudo systemctl edit nginxاین دستور فایلی در /etc/systemd/system/nginx.service.d/override.conf میسازد. بعد از ذخیره، systemd خودش تغییر را اعمال میکند. دیدن فایل نهایی با systemctl cat nginx ممکن است.
عیبیابی سرویسی که بالا نمیآید
مراحل پیشنهادی به ترتیب:
systemctl status نام-سرویسرا ببینید و خطهای آخر لاگ را بخوانید.- لاگ کاملتر را با
journalctl -u نام-سرویس -n 100 --no-pagerبخوانید. - اگر پیام درباره کانفیگ است، کانفیگ را با ابزار خود سرویس تست کنید، مثلاً
sudo nginx -tیاsudo php-fpm8.3 -t. - بررسی کنید پورتی که سرویس میخواهد را سرویس دیگری نگرفته باشد:
sudo ss -ltnp. - فضای دیسک و حافظه را ببینید؛ سرویسها با پر بودن دیسک بالا نمیآیند.
- اگر فایل سرویس را عوض کردهاید،
sudo systemctl daemon-reloadرا فراموش نکرده باشید.
خطاهای رایج
| نشانه | علت و راه حل |
|---|---|
Unit nginx.service could not be found | بسته نصب نیست یا نام سرویس فرق دارد؛ systemctl list-unit-files را ببینید |
Failed to start ... Address already in use | پورت را سرویس دیگری گرفته |
start request repeated too quickly | سرویس مدام میافتد و systemd جلوی تلاشها را گرفته؛ علت را در لاگ پیدا کنید، بعد systemctl reset-failed بزنید |
| بعد از ریاستارت سرور سرویس بالا نیامد | فقط start شده، enable نشده |
| تغییر فایل سرویس اثر ندارد | daemon-reload اجرا نشده |
Permission denied در لاگ | دسترسی فایل یا SELinux؛ لاگ و نتیجه ausearch -m avc را ببینید |
دستورهای بیشتر برای بررسی سلامت سرور در دستورات مانیتورینگ سرور لینوکس آمده است. نصب Docker که از systemd استفاده میکند در نصب Docker روی اوبونتو توضیح داده شده است.
سوالات متداول
در دستورات systemctl فرق restart و reload چیست؟
restart سرویس را کامل متوقف و دوباره شروع میکند و اتصالهای جاری قطع میشوند. reload فقط کانفیگ را دوباره میخواند و بدون قطع کار میکند. همه سرویسها reload ندارند.
systemctl با service چه فرقی دارد؟
دستور service پوششی قدیمی است که روی توزیعهای systemd به همان systemctl وصل میشود. در سیستمهای جدید از systemctl استفاده کنید.
مسیر لاگ سرویسها کجاست؟
بسیاری از سرویسها مستقیم در journal مینویسند و با journalctl خوانده میشوند. بعضی، مثل Nginx و Apache، علاوه بر آن در فایلهای جدا زیر /var/log/ هم لاگ مینویسند.
چطور بفهمم چه سرویسهایی در بوت بالا میآیند؟
systemctl list-unit-files --type=service --state=enabled فهرست سرویسهای فعال در بوت را نشان میدهد. سرویسهایی که لازم ندارید را غیرفعال کنید تا سطح حمله و مصرف حافظه کم شود.





