systemctl و مدیریت سرویس در لینوکس؛ 5 گام ساخت سرویس اختصاصی

در مقاله قبلی، ساختار پوشه‌های لینوکس را بررسی کردیم و دیدیم که هر فایل کجای این سیستم درختی قرار دارد. اما چه کسی این سیستم را اداره می‌کند؟ چه کسی مراقب است که وقتی دکمه پاور را می‌زنید، اینترنت وصل شود، وب‌سرور بالا بیاید و لاگ‌ها ثبت شوند؟

امروز قرار است با systemctl و systemd در لینوکس آشنا شوید. آیا تا به حال فکر کرده‌اید که وقتی دکمه پاور کامپیوتر را فشار می‌دهید و سیستم روشن میشود لینوکس چطور می‌فهمد که باید اینترنت را وصل کند، محیط گرافیکی را بالا بیاورد و ده‌ها برنامه دیگر را در پس‌ زمینه اجرا کند؟ پاسخ در یک کلمه است: systemd.

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

تفاوت مفهومی systemd و systemctl

برای درک بهتر، لینوکس را مانند یک شهر یا یک سیستم زیرساخت بزرگ ببینید:

  • systemd (مرکز کنترل و مدیریت): این نرم‌افزار، اتاق فرمان شهر است. اولین پردازشی که بعد از روشن شدن سیستم اجرا می‌شود (PID 1) و وظیفه مدیریت تمام بخش‌ها را بر عهده دارد، وظیفه روشن کردن چراغ‌ های خیابان‌ ها (سرویس‌ ها)، مدیریت ترافیک (پردازش‌ ها) و نظارت بر تمام بخش‌های حیاتی را برعهده دارد.
  • systemctl (کنترل از راه‌ دور مرکز): این دستوری است که ما در ترمینال صادر می‌کنیم. ما مستقیماً به اتاق فرمان نمی‌رویم! بلکه از طریق systemctl فرمان می‌دهیم که مثلاً نیروگاه برق منطقه یک (power-plant.service) را برای تعمیرات متوقف (stop) کند یا سیستم آبرسانی (water.service) را راه‌اندازی مجدد (restart) کند.

این ابزار در کدام توزیع‌ها وجود دارد؟

امروزه تقریباً تمام توزیع‌های محبوب لینوکس از این استاندارد استفاده می‌کنند. اگر شما از یکی از سیستم‌های زیر استفاده می‌کنید، این آموزش دقیقاً برای شماست:

  • خانواده دبیان: مثل Ubuntu، Kali Linux و Linux Mint.
  • خانواده ردهت: مثل Fedora، CentOS و RHEL.
  • خانواده آرچ: مثل Arch Linux و Manjaro.

شروع عملی: کار با دستورات اصلی

بیایید بدون نصب هیچ برنامه اضافه‌ای، با سرویس مدیریت شبکه سیستم خودتان (NetworkManager) تمرین کنیم.

مرور سریع اجزای systemctl

  1. start: اجرای آنی.
  2. stop: توقف آنی.
  3. status: بررسی وضعیت.
  4. enable: اجرای خودکار هنگام روشن شدن سیستم (Boot).

تمرین: با دستور sudo systemctl stop NetworkManager اینترنت خود را قطع کنید و سپس با
sudo systemctl start NetworkManager دوباره آن را وصل کنید.برای شروع خوب بود؟ 🙂

همچنین وضعیت شبکه را با دستور زیر میتوانید مشاهده کنید:

sudo systemctl status NetworkManager

پروژه عملی: ساخت سرویس مانیتورینگ RAM

حالا بیایید یک سطح بالاتر برویم و خودمان یک سرویس بسازیم که هر ۱۰ ثانیه میزان حافظه آزاد سیستم را رصد و در یک فایل لاگ ذخیره کند.

مرحله ۱: ساخت اسکریپت

ابتدا یک پوشه و یک اسکریپت ساده می‌سازیم:

mkdir -p ~/scripts
nano ~/scripts/ram-check.sh

کد زیر را درون آن قرار دهید:

#!/bin/bash

# Start an infinite loop to monitor memory
while true; do
    # Append the current date and free memory amount to the log file
    echo "Amount of free memory in $(date): $(free -h | grep Mem | awk '{print $4}')" >> /tmp/ram_usage.log
    
    # Wait for 10 seconds before the next check
    sleep 10
done

(با دستور chmod +x ~/scripts/ram-check.sh اجازه اجرا به آن بدهید).

مرحله ۲: تعریف سرویس

حالا باید این اسکریپت را به عنوان یک سرویس به لینوکس معرفی کنیم. فایلی در مسیر زیر بسازید:

sudo nano /etc/systemd/system/ram-monitor.service

و این شناسنامه را برای سرویس بنویسید:

[Unit]
Description=My Custom RAM Monitoring Service

[Service]
ExecStart=/bin/bash /home/USER/scripts/ram-check.sh
Restart=always
# Wait 10 seconds before restarting after a crash or kill
RestartSec=10

[Install]
WantedBy=multi-user.target

(به جای USER، نام کاربری خودتان را بنویسید).

استفاده از پارامتر RestartSec=10 باعث میشود اگر سرویس کرش کند یا kill شود، سیستم ۱۰ ثانیه صبر می‌کند و بعد آن را بالا می‌آورد. این کار باعث می‌شود پردازنده (CPU) در اثر ریستارت‌ های متوالی و سریع درگیر نشود.

مرحله ۳: فعالسازی سرویس

بعد از ذخیره فایل، دستورات زیر را بزنید تا سرویس فعال شود:

sudo systemctl daemon-reload
sudo systemctl start ram-monitor
sudo systemctl enable ram-monitor

حالا یک چالش! وارد ترمینال شوید و فایل لاگ را باز کنید:

tail -f /tmp/ram_usage.log


در یک ترمینال دیگر، با دستور kill اسکریپت خود را متوقف کنید:

sudo pkill -f ram-check.sh

خواهید دید که به دلیل وجود خط RestartSec=10 سیستم ۱۰ ثانیه صبر می‌ کند و بعد آن را بالا می‌آورد.

sudo pkill -f ram-check.sh

چطور اسکریپت نوشته شده را متوقف کنیم؟

برای متوقف کردن اسکریپتی که به صورت سرویس در حال اجراست، نباید از دستورات مدیریت پروسس مثل pkill استفاده کرد؛ باید مستقیماً به Manager (یعنی systemctl) دستور بدهید.

متوقف کردن موقت

sudo systemctl stop ram-monitor.service

غیرفعال کردن دائمی (که بعد از ریبوت اجرا نشود)

sudo systemctl disable ram-monitor.service

عیب‌یابی با journalctl

اگر سرویسی به درستی کار نکرد، باید به journalctl سیستم سر بزنید. با دستور زیر می‌توانید به صورت زنده ببینید در سرویس شما چه می‌گذرد:

sudo journalctl -u ram-monitor.service -f

جمع بندی

در این مقاله یاد گرفتیم که چطور یک سرویس را راه اندازی کنیم. ما نه تنها تفاوت این دو مفهوم “systemctl & systemd” را درک کردیم، بلکه یاد گرفتیم چطور یک اسکریپت ساده را به یک سرویس دائمی تبدیل کنیم.

2 دیدگاه دربارهٔ «systemctl و مدیریت سرویس در لینوکس؛ 5 گام ساخت سرویس اختصاصی;

  1. I seriously love your website.. Excellent colors & theme.
    Did you build this web site yourself? Please reply back as I’m
    attempting to create my own website and would like to know where you got this from
    or just what the theme is named. Thank you!

    پاسخ
    • Hi there,

      Thank you so much for your kind words i really appreciate it!

      Yes, i built the website myself using WordPress. The theme I’m using is GeneratePress, which is a lightweight and highly customizable theme. It’s actually a great choice if you’re just getting started because it’s fast, flexible, and easy to work with.

      If you’re planning to build your own site, I definitely recommend checking it out. And if you have any questions along the way, feel free to ask — I’d be more than happy to help!

      Best of luck with your website, and thanks again for your support

      پاسخ

دیدگاهتان را بنویسید