چرا systemd استاندارد مدیریت سرویس در لینوکس است؟
اگر سرور لینوکسی را مدیریت کرده باشید، تقریباً مطمئن هستید که با systemd سروکار داشتهاید. این سیستم بهعنوان مدیر سرویس و فرایندها (init system) در اکثر توزیعهای مدرن مانند Ubuntu، Debian، CentOS و Rocky Linux جایگزین SysVinit شده است. برخلاف روشهای قدیمی که اسکریپتهای سادهای را اجرا میکردند، systemd به شما امکان میدهد سرویسها را بهصورت موازی راهاندازی کنید، وابستگیها را مدیریت کنید، وضعیت دقیق هر سرویس را ببینید و لاگهای یکپارچهای را با journalctl بررسی کنید.
در این مقاله بهجای توضیح تئوری، مستقیماً سراغ دستورات عملی میرویم. شما یاد میگیرید که چگونه یک سرویس را شروع، متوقف، فعال و غیرفعال کنید، وضعیت آن را بررسی کنید و مشکلات رایج را با خواندن لاگها عیبیابی کنید. این دانش برای هر مدیر سروری که با وبسرورها، دیتابیسها یا برنامههای سفارشی کار میکند، ضروری است.
شروع کار با systemctl: دستورات پایه
ابزار اصلی مدیریت systemd، دستور systemctl است. این دستور به شما اجازه میدهد تا با واحدهای (units) systemd کار کنید؛ واحدها میتوانند سرویسها (.service)، سوکتها (.socket)، تایمرها (.timer) و موارد دیگر باشند. در این بخش روی سرویسها تمرکز میکنیم.
شروع و توقف سرویس
برای شروع یک سرویس، از زیردستور start استفاده کنید:
sudo systemctl start nginx
این دستور سرویس nginx را بلافاصله اجرا میکند، اما آن را برای راهاندازی مجدد در بوت فعال نمیکند. برای توقف سرویس:
sudo systemctl stop nginx
اگر سرویس پاسخ نمیدهد و نیاز به توقف اجباری دارید، میتوانید از kill استفاده کنید که سیگنال SIGKILL را ارسال میکند:
sudo systemctl kill -s SIGKILL nginx
نکته مهم: دستور stop بهصورت تمیز (graceful) سرویس را متوقف میکند و به آن فرصت میدهد تا منابع را آزاد کند. دستور kill را فقط زمانی استفاده کنید که سرویس واقعاً قفل شده است.
فعال و غیرفعال کردن سرویس در بوت
برای اینکه سرویس هنگام بوت شدن سرور بهصورت خودکار اجرا شود، باید آن را enable کنید:
sudo systemctl enable nginx
این دستور یک symbolic link در دایرکتوری /etc/systemd/system/multi-user.target.wants/ ایجاد میکند. برای غیرفعال کردن:
sudo systemctl disable nginx
اگر میخواهید سرویس را هماکنون شروع کنید و هم در بوت فعال باشد، میتوانید دو دستور را ترکیب کنید:
sudo systemctl enable --now nginx
این روش بسیار کارآمد است و در اسکریپتهای اتوماسیون نیز رایج است.
بررسی وضعیت سرویس
دستور status اطلاعات جامعی درباره سرویس ارائه میدهد:
systemctl status nginx
خروجی این دستور شامل موارد زیر است:
- وضعیت فعلی (active، inactive، failed)
- شناسه فرایند (PID) و زمان اجرا
- حافظه مصرفی
- آخرین لاگهای سرویس
- مسیر فایل واحد (unit file)
برای بررسی سریع اینکه آیا سرویس فعال است یا نه، از گزینه is-active استفاده کنید:
systemctl is-active nginx
خروجی این دستور یا active است یا inactive یا failed. این دستور در اسکریپتهای نظارتی بسیار مفید است.
خواندن لاگها با journalctl
یکی از بزرگترین مزیتهای systemd نسبت به روشهای قدیمی، یکپارچهسازی لاگها است. بهجای جستجو در فایلهای جداگانه در /var/log/، میتوانید همه لاگها را با journalctl مشاهده کنید.
مشاهده لاگ یک سرویس خاص
برای دیدن لاگهای سرویس nginx:
journalctl -u nginx
این دستور تمام لاگهای مربوط به واحد nginx را از ابتدای ثبت نمایش میدهد. برای دیدن فقط ۵۰ خط آخر:
journalctl -u nginx -n 50
برای دنبال کردن لاگها بهصورت زنده (مانند tail -f):
journalctl -u nginx -f
این گزینه هنگام عیبیابی یک مشکل در حال وقوع بسیار کاربردی است.
فیلتر کردن بر اساس زمان
برای دیدن لاگهای مربوط به یک بازه زمانی خاص، از گزینه --since و --until استفاده کنید:
journalctl -u nginx --since "2025-01-15 10:00:00" --until "2025-01-15 11:00:00"
همچنین میتوانید از عبارات نسبی استفاده کنید:
journalctl -u nginx --since "1 hour ago"
این روش برای پیدا کردن خطاهایی که در یک بازه خاص رخ دادهاند، عالی است.
فیلتر بر اساس اولویت (Priority)
لاگها دارای سطوح اولویت هستند (از 0 برای emergency تا 7 برای debug). برای دیدن فقط خطاها و بحرانیها:
journalctl -u nginx -p err
این دستور فقط پیامهایی با اولویت err (3) یا بالاتر را نشان میدهد. برای دیدن همه پیامها از debug به بالا:
journalctl -u nginx -p debug
عیبیابی رایج: وقتی سرویس failed میشود
یکی از رایجترین مشکلات، وضعیت failed است. وقتی سرویسی شروع نمیشود، اولین قدم بررسی وضعیت است:
systemctl status nginx
خروجی معمولاً شامل پیام خطایی مانند Failed to start A high performance web server است. برای دیدن جزئیات بیشتر، لاگها را بررسی کنید:
journalctl -u nginx -n 30 --no-pager
گزینه --no-pager باعث میشود خروجی بدون صفحهبندی نمایش داده شود و برای اسکریپتها مفید است.
مشکل رایج: پورت در حال استفاده است
اگر سرویس شما نتواند به پورت مورد نظر متصل شود، خطایی مانند Address already in use خواهید دید. برای پیدا کردن فرایندی که پورت را اشغال کرده است:
sudo ss -tulpn | grep :80
سپس میتوانید فرایند مزاحم را متوقف کنید یا پورت سرویس را تغییر دهید.
مشکل رایج: خطای Permission Denied
اگر سرویس شما به فایل یا دایرکتوری خاصی دسترسی ندارد، خطای Permission denied در لاگ ظاهر میشود. معمولاً این مشکل به دلیل مالکیت نادرست فایلهاست. با دستور زیر مالکیت را اصلاح کنید:
sudo chown -R www-data:www-data /var/www/html
همیشه مطمئن شوید که سرویس با کاربر صحیح (در اینجا www-data) اجرا میشود. این کاربر در فایل واحد سرویس تعریف شده است.
مدیریت فایلهای واحد (Unit Files)
هر سرویس در systemd یک فایل واحد دارد که معمولاً در /etc/systemd/system/ یا /lib/systemd/system/ قرار دارد. برای مشاهده محتوای فایل واحد یک سرویس:
systemctl cat nginx
برای ویرایش فایل واحد بدون باز کردن مستقیم آن:
sudo systemctl edit nginx
این دستور یک فایل override ایجاد میکند که تنظیمات شما را بدون تغییر فایل اصلی اعمال میکند. این روش بسیار امنتر است، زیرا بهروزرسانیهای بسته اصلی را خراب نمیکند.
ایجاد یک سرویس سفارشی
فرض کنید یک اسکریپت پایتون دارید که باید بهعنوان سرویس اجرا شود. یک فایل واحد در /etc/systemd/system/myapp.service ایجاد کنید:
[Unit]
Description=My Custom Python Application
After=network.target
[Service]
Type=simple
User=myuser
WorkingDirectory=/opt/myapp
ExecStart=/usr/bin/python3 /opt/myapp/app.py
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target
سپس systemd را مجدداً بارگذاری کنید و سرویس را فعال کنید:
sudo systemctl daemon-reload
sudo systemctl enable --now myapp
گزینه Restart=on-failure باعث میشود سرویس در صورت خطا بهطور خودکار پس از ۵ ثانیه دوباره راهاندازی شود. این ویژگی برای افزایش پایداری برنامههای حیاتی بسیار مفید است.
نکات پیشرفته و ترفندهای کاربردی
مدیریت چند سرویس بهطور همزمان
میتوانید چند سرویس را با یک دستور مدیریت کنید:
sudo systemctl start nginx mysql php-fpm
این دستور هر سه سرویس را بهترتیب شروع میکند.
مشاهده همه سرویسهای فعال
برای دیدن لیست همه سرویسهای فعال در سیستم:
systemctl list-units --type=service --state=active
برای دیدن سرویسهای ناموفق:
systemctl list-units --type=service --state=failed
راهاندازی مجدد سرویس
برای اعمال تغییرات در تنظیمات سرویس، آن را ریاستارت کنید:
sudo systemctl restart nginx
اگر فقط میخواهید فایل پیکربندی را بدون قطعی کامل دوباره بارگذاری کنید، از reload استفاده کنید:
sudo systemctl reload nginx
دستور reload بسیار بهتر است، زیرا بدون قطع سرویس، تنظیمات جدید را اعمال میکند. اما توجه داشته باشید که همه سرویسها از این قابلیت پشتیبانی نمیکنند.
جمعبندی
مدیریت سرویسها با systemd مهارتی است که هر مدیر سروری باید به آن مسلط باشد. با تسلط بر دستورات systemctl و journalctl، میتوانید سرویسها را بهطور مؤثر مدیریت کنید، مشکلات را سریعتر عیبیابی کنید و پایداری سرور خود را افزایش دهید. اگر بهدنبال یک محیط میزبانی امن و قابل اعتماد برای اجرای سرویسهای خود هستید، سرورهای مجازی و اختصاصی ServerNet با پشتیبانی کامل از systemd میتوانند گزینه مناسبی باشند.
تمرین کنید، با فایلهای واحد آزمایش کنید و همیشه قبل از تغییرات بزرگ، از تنظیمات فعلی خود نسخه پشتیبان تهیه کنید. مدیریت حرفهای سرویسها، تفاوت بین یک سرور پایدار و یک سرور پر از مشکل است.