بلاگ هوش‌گراف

استقرار پروژه، DevOps و زیرساخت ابری برای تیم‌های ایرانی

لینوکس / مدیریت سرور 2 دقیقه مطالعه

مدیریت سرویس‌ها با systemctl و journalctl؛ راهنمای کامل

از start/stop/enable تا خواندن لاگ و عیب‌یابی سرویس failed با systemctl و journalctl.

هوش‌گراف 28 تیر 1405

در توزیع‌های مدرن لینوکس، systemd مسئول راه‌اندازی سرویس‌ها، وابستگی‌ها و جمع‌آوری لاگ است. اگر systemctl و journalctl را خوب بلد باشید، عیب‌یابی سرویس‌هایی مثل nginx، docker، php-fpm یا اپ خودتان به‌مراتب سریع‌تر می‌شود.

این راهنما از کارهای روزمره شروع می‌کند و تا خواندن لاگ‌های فیلترشده و درک unit file جلو می‌رود.

مفاهیم پایه: unit، service، target

هر سرویس معمولاً یک فایل .service دارد. targetها شبیه runlevelهای قدیمی‌اند و مجموعه واحدها را گروه می‌کنند. برای کار روزمره بیشتر با unitهای type=service سروکار دارید.

دستورات حیاتی systemctl

sudo systemctl status nginx
sudo systemctl start nginx
sudo systemctl stop nginx
sudo systemctl restart nginx
sudo systemctl reload nginx
sudo systemctl enable --now nginx
sudo systemctl is-active nginx
sudo systemctl is-enabled nginx

تفاوت restart و reload مهم است: restart پروسس را می‌کشد و دوباره می‌سازد؛ reload معمولاً کانفیگ را بدون قطع کامل اعمال می‌کند (اگر سرویس پشتیبانی کند). enable باعث می‌شود بعد از reboot سرویس بالا بیاید؛ –now همان لحظه هم start می‌کند.

اگر status نشان می‌دهد failed، خط Active و بخش snipped لاگ را بخوانید؛ اغلب مسیر فایل کانفیگ یا پورت اشغال‌شده علت است.

لیست و وابستگی‌ها

systemctl list-units --type=service --state=running
systemctl list-dependencies nginx.service

list-dependencies کمک می‌کند بفهمید سرویس به چه چیزهایی وابسته است. اگر اپ شما به دیتابیس وابسته است و دیتابیس دیر بالا می‌آید، ممکن است نیاز بهRestart=on-failure یا دستورهای wait در اسکریپت داشته باشید.

خواندن لاگ با journalctl

journalctl -u nginx -n 100 --no-pager
journalctl -u nginx -f
journalctl -u nginx --since '1 hour ago'
journalctl -p err -b

گزینه -u واحد را فیلتر می‌کند، -f دنبال می‌کند، –since بازه زمانی می‌دهد و -p سطح اولویت است. -b فقط از آخرین boot. برای سرورهای پرلاگ، بدون فیلتر journalctl را روی کل سیستم اجرا نکنید.

اگر لاگ خالی است، ممکن است سرویس به فایل جداگانه در /var/log بنویسد یا سطح LogLevel پایین باشد. همچنین دسترسی کاربر غیر root به journal ممکن است محدود باشد.

ساخت و ویرایش unit ساده

برای اپ خودتان می‌توانید یک unit در /etc/systemd/system بسازید. بعد از هر تغییر: systemctl daemon-reload سپس restart. بدون daemon-reload تغییرات فایل دیده نمی‌شود.

[Unit]
Description=My App
After=network.target

[Service]
Type=simple
WorkingDirectory=/opt/app
ExecStart=/usr/bin/node server.js
Restart=on-failure
User=www-data

[Install]
WantedBy=multi-user.target

عیب‌یابی سرویس failed

  • systemctl status -l برای جزئیات بیشتر
  • journalctl -xe بلافاصله بعد از شکست
  • چک کردن ExecStart با اجرای دستی همان دستور
  • بررسی SELinux/AppArmor در صورت پیام permission عجیب
  • آزاد بودن پورت با ss -tulpn

اگر می‌خواهید بعد از یادگیری این مفاهیم، مسیر استقرار را سریع‌تر جلو ببرید، می‌توانید از پروژه ابری هوشمند هوش‌گراف هم استفاده کنید؛ اما مبانی این مقاله مستقل از هر پلتفرمی برای کار روزمره مفید است.

نکات عملی بیشتر درباره systemctl و journalctl

وقتی روی systemctl و journalctl کار می‌کنید، مهم‌ترین اصل این است که هر تغییر را قابل‌برگشت نگه دارید. یعنی قبل از اجرای دستور مخرب، خروجی را در فایل لاگ ذخیره کنید، از کانفیگ بکاپ بگیرید و اگر روی سرور production هستید، ابتدا روی staging تمرین کنید. بسیاری از خطاهای پرهزینه فقط به‌خاطر عجله و نبود چک‌لیست ساده رخ می‌دهند.

یک عادت خوب این است که برای هر سناریوی پرتکرار یک runbook کوتاه داشته باشید: علائم مشکل، دستور تشخیص، اقدام اصلاحی، و معیار موفقیت. این runbook لازم نیست رسمی باشد؛ حتی یک فایل Markdown در ریپو هم کافی است تا تیم یکسان عمل کند.

در محیط‌های ایران، محدودیت شبکه، latency رجیستری و قطعی لحظه‌ای DNS هم باید در runbook بیاید. اگر دستوری به اینترنت وابسته است، مسیر جایگزین یا کش محلی را از قبل مشخص کنید.

اشتباهات رایجی که باید از آن‌ها دوری کنید

  • کپی‌کردن دستور از اینترنت بدون فهم پارامترها
  • اجرای دستور مخرب روی production بدون بکاپ
  • نادیده گرفتن لاگ و فقط نگاه به پیام خطای اول
  • تغییر همزمان چند لایه (شبکه + سرویس + فایروال) بدون جداسازی تست
  • ذخیره secret داخل ریپو یا اسکریپت‌های عمومی

چک‌لیست جمع‌بندی

قبل از بستن کار روی systemctl و journalctl، این موارد را مرور کنید: آیا تغییر مستند شد؟ آیا rollback مشخص است؟ آیا مانیتورینگ یا حداقل یک healthcheck ساده وضعیت را نشان می‌دهد؟ آیا دسترسی‌ها حداقل لازم هستند؟ اگر پاسخ هر کدام منفی است، کار را تمام‌شده فرض نکنید.

یادگیری عمیق زمانی رخ می‌دهد که بعد از هر حادثه، یک یادداشت کوتاه بنویسید: چه دیدید، چه فرضی اشتباه بود، و دفعه بعد چه می‌کنید. این چرخه از ده‌ها دوره آموزشی سطحی مؤثرتر است.

نکات عملی بیشتر درباره systemctl و journalctl

وقتی روی systemctl و journalctl کار می‌کنید، مهم‌ترین اصل این است که هر تغییر را قابل‌برگشت نگه دارید. یعنی قبل از اجرای دستور مخرب، خروجی را در فایل لاگ ذخیره کنید، از کانفیگ بکاپ بگیرید و اگر روی سرور production هستید، ابتدا روی staging تمرین کنید. بسیاری از خطاهای پرهزینه فقط به‌خاطر عجله و نبود چک‌لیست ساده رخ می‌دهند.

یک عادت خوب این است که برای هر سناریوی پرتکرار یک runbook کوتاه داشته باشید: علائم مشکل، دستور تشخیص، اقدام اصلاحی، و معیار موفقیت. این runbook لازم نیست رسمی باشد؛ حتی یک فایل Markdown در ریپو هم کافی است تا تیم یکسان عمل کند.

در محیط‌های ایران، محدودیت شبکه، latency رجیستری و قطعی لحظه‌ای DNS هم باید در runbook بیاید. اگر دستوری به اینترنت وابسته است، مسیر جایگزین یا کش محلی را از قبل مشخص کنید.

اشتباهات رایجی که باید از آن‌ها دوری کنید

  • کپی‌کردن دستور از اینترنت بدون فهم پارامترها
  • اجرای دستور مخرب روی production بدون بکاپ
  • نادیده گرفتن لاگ و فقط نگاه به پیام خطای اول
  • تغییر همزمان چند لایه (شبکه + سرویس + فایروال) بدون جداسازی تست
  • ذخیره secret داخل ریپو یا اسکریپت‌های عمومی

چک‌لیست جمع‌بندی

قبل از بستن کار روی systemctl و journalctl، این موارد را مرور کنید: آیا تغییر مستند شد؟ آیا rollback مشخص است؟ آیا مانیتورینگ یا حداقل یک healthcheck ساده وضعیت را نشان می‌دهد؟ آیا دسترسی‌ها حداقل لازم هستند؟ اگر پاسخ هر کدام منفی است، کار را تمام‌شده فرض نکنید.

یادگیری عمیق زمانی رخ می‌دهد که بعد از هر حادثه، یک یادداشت کوتاه بنویسید: چه دیدید، چه فرضی اشتباه بود، و دفعه بعد چه می‌کنید. این چرخه از ده‌ها دوره آموزشی سطحی مؤثرتر است.

نکات عملی بیشتر درباره systemctl و journalctl

وقتی روی systemctl و journalctl کار می‌کنید، مهم‌ترین اصل این است که هر تغییر را قابل‌برگشت نگه دارید. یعنی قبل از اجرای دستور مخرب، خروجی را در فایل لاگ ذخیره کنید، از کانفیگ بکاپ بگیرید و اگر روی سرور production هستید، ابتدا روی staging تمرین کنید. بسیاری از خطاهای پرهزینه فقط به‌خاطر عجله و نبود چک‌لیست ساده رخ می‌دهند.

یک عادت خوب این است که برای هر سناریوی پرتکرار یک runbook کوتاه داشته باشید: علائم مشکل، دستور تشخیص، اقدام اصلاحی، و معیار موفقیت. این runbook لازم نیست رسمی باشد؛ حتی یک فایل Markdown در ریپو هم کافی است تا تیم یکسان عمل کند.

در محیط‌های ایران، محدودیت شبکه، latency رجیستری و قطعی لحظه‌ای DNS هم باید در runbook بیاید. اگر دستوری به اینترنت وابسته است، مسیر جایگزین یا کش محلی را از قبل مشخص کنید.

اشتباهات رایجی که باید از آن‌ها دوری کنید

  • کپی‌کردن دستور از اینترنت بدون فهم پارامترها
  • اجرای دستور مخرب روی production بدون بکاپ
  • نادیده گرفتن لاگ و فقط نگاه به پیام خطای اول
  • تغییر همزمان چند لایه (شبکه + سرویس + فایروال) بدون جداسازی تست
  • ذخیره secret داخل ریپو یا اسکریپت‌های عمومی

چک‌لیست جمع‌بندی

قبل از بستن کار روی systemctl و journalctl، این موارد را مرور کنید: آیا تغییر مستند شد؟ آیا rollback مشخص است؟ آیا مانیتورینگ یا حداقل یک healthcheck ساده وضعیت را نشان می‌دهد؟ آیا دسترسی‌ها حداقل لازم هستند؟ اگر پاسخ هر کدام منفی است، کار را تمام‌شده فرض نکنید.

یادگیری عمیق زمانی رخ می‌دهد که بعد از هر حادثه، یک یادداشت کوتاه بنویسید: چه دیدید، چه فرضی اشتباه بود، و دفعه بعد چه می‌کنید. این چرخه از ده‌ها دوره آموزشی سطحی مؤثرتر است.

نظرات

هنوز نظری ثبت نشده. دیدگاه‌تان را بنویسید.

ثبت نظر

ایمیل شما منتشر نمی‌شود. فیلدهای ضروری علامت * دارند.