دستورات systemctl و journalctl برای مدیریت سرویس ها

با دستورات 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
حجم journaljournalctl --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 ممکن است.

عیب‌یابی سرویسی که بالا نمی‌آید

مراحل پیشنهادی به ترتیب:

  1. systemctl status نام-سرویس را ببینید و خط‌های آخر لاگ را بخوانید.
  2. لاگ کامل‌تر را با journalctl -u نام-سرویس -n 100 --no-pager بخوانید.
  3. اگر پیام درباره کانفیگ است، کانفیگ را با ابزار خود سرویس تست کنید، مثلاً sudo nginx -t یا sudo php-fpm8.3 -t.
  4. بررسی کنید پورتی که سرویس می‌خواهد را سرویس دیگری نگرفته باشد: sudo ss -ltnp.
  5. فضای دیسک و حافظه را ببینید؛ سرویس‌ها با پر بودن دیسک بالا نمی‌آیند.
  6. اگر فایل سرویس را عوض کرده‌اید، 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 فهرست سرویس‌های فعال در بوت را نشان می‌دهد. سرویس‌هایی که لازم ندارید را غیرفعال کنید تا سطح حمله و مصرف حافظه کم شود.

منابع