سیستمعامل لینوکس مجموعهای گسترده از سرویسهای سیستمی و شبکهای را ارائه میدهد. سرویسهای سیستمی شامل بخشهایی مانند مدیریت فرآیندها، ورود کاربران به سیستم، ثبت گزارشها (syslog) و زمانبندی وظایف (cron) هستند. در کنار آن، سرویسهای شبکه نیز وظایفی همچون اتصال از راه دور، ارسال و دریافت ایمیل، مدیریت چاپگرها، میزبانی وبسایتها، ذخیره و انتقال دادهها، تفکیک نام دامنه (DNS) و تخصیص پویای آدرسهای IP (DHCP) را بر عهده دارند.
از نظر فنی، هر سرویس در لینوکس مجموعهای از فرآیندهاست که معمولا با عنوان دیمون (Daemon) شناخته میشوند. این فرآیندها بهصورت مداوم در پسزمینه سیستم اجرا شده و منتظر دریافت درخواستها، بهویژه از سمت کاربران یا کلاینتها هستند.
لینوکس ابزارها و روشهای متنوعی برای مدیریت سرویسها در اختیار مدیران سیستم قرار میدهد، از جمله اجرای سرویسها (start)، توقف (stop)، راهاندازی مجدد (restart) و فعالسازی اجرای خودکار آنها هنگام بوت سیستم. امروزه تقریبا تمام توزیعهای مدرن لینوکس برای انجام این وظایف از یک مدیر سیستم و سرویس Systemd استفاده میکنند.
Systemd چیست؟
Systemd یکی از مهمترین اجزای سیستمعامل لینوکس است که وظیفهی مدیریت سرویسها و فرآیندهای سیستم را بر عهده دارد. این ابزار در واقع جایگزینی مدرن برای فرآیند init محسوب میشود که همچنان با اسکریپتهای سنتی SysV و LSB init نیز سازگار است.
برای کنترل و مدیریت سرویسها در systemd، از دستور اصلی systemctl استفاده میشود که امکان راهاندازی، توقف، فعالسازی و بررسی وضعیت سرویسها را فراهم مینماید.
تفاوت سرویسهای فعال با سرویسهای در حال اجرا در لینوکس
در لینوکس، سرویسهای فعال (Enabled) به سرویسهایی گفته میشود که برای اجرای خودکار در زمان بوت سیستم پیکربندی شدهاند. در مقابل، سرویسهای در حال اجرا (Running) آنهایی هستند که در حال حاضر در حافظه سیستم فعال بوده و مشغول به کار هستند.
توجه داشته باشید که فعال بودن یک سرویس حتما به معنای اجرای آن نیست. به عنوان مثال، ممکن است یک سرویس برای اجرا در زمان مشخصی برنامهریزی شده باشد یا تنها در صورت نیاز (on-demand) فعال شود. در چنین شرایطی، سرویس فعال است اما هنوز در حال اجرا نیست.
این تفاوت برای مدیران سیستم اهمیت زیادی دارد، زیرا کمک میکند تشخیص دهند کدام سرویسها باید در زمان بوت فعال شوند و کدامیک در لحظهی کنونی منابع سیستم را اشغال کردهاند.
برای لیست کردن سرویسهای فعال:
systemctl list-unit-files --type=service --state=enabled
برای مقایسه با سرویسهای در حال اجرا:
systemctl list-units --type=service --state=running
این تمایز به عیبیابی سرویسهایی که قرار است شروع شوند اما استارت نمیشوند یا سرویسهایی که به طور غیرمنتظره اجرا میشوند، کمک میکند.
چرا سرویسهای در حال اجرا را در لینوکس لیست کنیم؟
آگاهی از اینکه کدام سرویسها در سیستم لینوکسی شما در حال اجرا هستند، نقش مهمی در مدیریت و بهینهسازی عملکرد سیستم دارد. این موضوع برای موارد زیر اهمیت ویژهای دارد:
- نظارت بر میزان استفاده از منابع سیستم
- عیبیابی مشکلات عملکرد یا کندی سیستم
- اطمینان از فعال بودن سرویسهای حیاتی و ضروری
- افزایش کارایی و امنیت کلی سیستمعامل
مدیر سرویس Systemd با استفاده از مجموعهای از دستورات قدرتمند systemctl این فرآیند را بسیار ساده کرده است. این ابزار به شما امکان میدهد تا بهراحتی سرویسهای فعال را لیست، کنترل و پایش کنید.
در این مطلب، مراحل لیست کردن تمام سرویسهای در حال اجرا در Systemd را گامبهگام بررسی میکنیم و توضیحاتی جامع برای کاربران در سطوح مختلف ارائه خواهیم داد.
فهرست کردن سرویسهای در حال اجرا تحت SystemD در لینوکس
هنگامی که دستور systemctl را بدون هیچ آرگومانی اجرا میکنید، لیستی از تمام واحدهای systemd بارگذاری شده نمایش داده میشود، از جمله سرویسها و وضعیت آنها (فعال یا غیرفعال بودن) را نشان میدهد.
# systemctl
فهرست کردن تمام سرویسهای بارگذاریشده( Loaded) در لینوکس
برای فهرست کردن تمام سرویسهای بارگذاریشده روی سیستم خود (چه فعال، در حال اجرا، خارجشده یا ناموفق)، از زیردستور list-units و سوئیچ type– با مقدار service استفاده کنید.
# systemctl list-units --type=service OR # systemctl --type=service
فهرست فقط سرویسهای فعال(Active) در لینوکس
و برای فهرست کردن تمام سرویسهای بارگذاریشده اما فعال، چه در حال اجرا و چه آنهایی که خارج شدهاند، میتوانید گزینه –state را با مقدار active به صورت زیر اضافه کنید.
# systemctl list-units --type=service --state=active OR # systemctl --type=service --state=active
فهرست سرویسهای در حال اجرا(Running) در لینوکس با استفاده از systemctl
اما برای نگاهی سریع به تمام سرویسهای در حال اجرا (یعنی تمام سرویسهای بارگذاریشده و فعال در حال اجرا)، دستور زیر را اجرا کنید.
# systemctl list-units --type=service --state=running OR # systemctl --type=service --state=running
بیایید اصطلاحات کلیدی مربوط به واحدهای Systemd و وضعیت آنها را بررسی کنیم:
- Unit – یک یونیت میتواند یک سرویس، یک سوکت، یک دستگاه یا موجودیتهای مختلف دیگر باشد.
- Load – نشان میدهد که آیا یونیت بارگذاری شده است یا خیر. یک unit میتواند بارگذاری شود اما حتما فعال نیست.
- Active – نشان میدهد که آیا یونیت به طور فعال در حال اجرا است یا اینکه با مشکلاتی مواجه شده و در حالت ناموفق یا غیرفعال است.
- SUB – جزئیات بیشتری در مورد وضعیت خاص واحد ارائه میدهد. برای سرویسها، ممکن است نشان دهد که آیا سرویس در حال اجرا (running)، متوقف (exited) یا با مشکل (failed) است.
- Description – به کاربران کمک میکند تا هدف واحد را بدون نیاز به بررسی دقیق فایلهای پیکربندی شناسایی و درک کنند.
ایجاد یک نام مستعار برای دستورات systemctl
اگر مرتب از دستور قبلی استفاده میکنید، میتوانید یک دستور مستعار (alias command) در فایل bashrc~/. ایجاد کنید، همانطور که نشان داده شده است تا به راحتی آن را فراخوانی کنید.
# vim ~/.bashrc
سپس خط زیر را، زیر لیست نامهای مستعار (alias) اضافه کنید.
alias running_services='systemctl list-units --type=service --state=running'
تغییرات را در فایل ذخیره کرده و آن را ببندید. از این به بعد، از دستور running_services برای مشاهده لیستی از تمام سرویسهای بارگذاری شده و فعال در حال اجرا روی سرور خود استفاده کنید.
# running_services #use the Tab completion
پورتی را که یک سرویس استفاده میکند پیدا کنید
علاوه بر این، یک جنبه مهم سرویسها، پورتی است که آنها استفاده میکنند. برای تعیین پورتی که یک فرآیند daemon به آن گوش میدهد، میتوانید از دستور netstat یا ss همانطور که نشان داده شده است استفاده کنید.
که در آن پرچم l- به معنی چاپ تمام سوکتهای در حال گوش دادن است، t- تمام اتصالات TCP را نمایش میدهد، u- تمام اتصالات UDP را نشان میدهد، n- به معنی چاپ شماره پورتهای عددی (به جای نام برنامهها) و p- به معنی نمایش نام برنامه است.
netstat -ltup | grep zabbix_agentd OR ss -ltup | grep zabbix_agentd
فهرست کردن سرویسها و پورتهای باز فایروال
همچنین، اگر سرور شما سرویس فایروالی در حال اجرا دارد که نحوه مسدود کردن یا اجازه دادن به ترافیک به یا از سرویسها یا پورتهای انتخاب شده را کنترل میکند، میتوانید سرویسها یا پورتهایی را که در فایروال باز شدهاند، با استفاده از دستور firewall-cmd یا ufw (بسته به توزیع لینوکسی که استفاده میکنید) همانطور که نشان داده شده است، فهرست کنید.
firewall-cmd --list-services [FirewallD] firewall-cmd --list-ports sudo ufw status [UFW Firewall]
خودکارسازی نظارت بر سرویس در لینوکس
بررسی دستی سرویسهای در حال اجرا میتواند خستهکننده باشد، به ویژه در سرورهای پروداکشن. خودکارسازی این فرآیند تضمین میکند که شما همیشه از تغییرات وضعیت سرویس بدون نیاز به بررسی دستی آگاه هستید.
خرید VPS لینوکس با دسترسی کامل SSH و منابع اختصاصی، مناسب برای برنامهنویسان، توسعهدهندگان و مدیران سایت در پارسدو فراهم است.
بررسی سرویسهای در حال اجرا هر ۵ دقیقه با یک Cron Job
cron job یک وظیفه زمانبندی شده در لینوکس است که در یک بازه زمانی خاص اجرا میشود. میتوانید از آن برای ثبت دورهای سرویسهای در حال اجرا استفاده کنید و بعدا در صورت خرابی یا خاموش شدنهای غیرمنتظره آنها را بررسی کنید.
crontab -e
این خط را برای ثبت سرویسهای در حال اجرا هر ۵ دقیقه اضافه کنید.
*/۵ * * * * systemctl list-units --type=service --state=running > /tmp/running_services.log
خروجی در فایل tmp/running_services.log/ ذخیره میشود و میتوانید آخرین سرویسهای ثبتشده را با استفاده از موارد زیر بررسی کنید:
cat /tmp/running_services.log OR tail -f /tmp/running_services.log
در صورت عدم موفقیت، یک سرویس را ریستارت کنید
بهطور پیشفرض، اگر یک سرویس بهطور غیرمنتظرهای خراب یا متوقف شود، مگر اینکه بهطور صریح پیکربندی شود، بهطور خودکار ریستارت نمیشود. برای اطمینان از اینکه یک سرویس هر زمان که از کار بیفتد، ریستارت میشود، میتوانید فایل واحد سرویس systemd آن را تغییر دهید.
بهعنوان مثال، از دستور زیر برای ویرایش پیکربندی سرویس استفاده کنید (apache2 را با نام سرویس واقعی که میخواهید بهطور خودکار ریستارت شود جایگزین کنید):
systemctl edit apache2
پس از ورود به ویرایشگر، خطوط زیر را اضافه کنید.
[Service] Restart=always RestartSec=5s
اکنون، systemd را ریلود کنید تا تغییرات اعمال شود.
systemctl daemon-reload
سپس، سرویس را ریستارت کنید تا مطمئن شوید که تنظیمات جدید را دریافت میکند.
systemctl restart apache2
برای تایید اینکه systemd برای ریستارت خودکار سرویس تنظیم شده است.
systemctl show apache2 --property=Restart
سختسازی سرویسها با گزینههای امنیتی systemd
برای افزایش امنیت سرویسهای حیاتی، میتوانید محدودیتهای systemd را به فایلهای واحد آنها اضافه کنید.
[Service] NoNewPrivileges=true ProtectSystem=full PrivateTmp=true
این محدودیتها قابلیتهای سرویس، دسترسی به فایل سیستم و جداسازی (isolation) را محدود میکنند. ابزارهایی مانند systemd-analyze security میتوانند به ارزیابی ریسک سرویس کمک کرده و بهبودهایی را پیشنهاد دهند.
جمعبندی
در این مطلب، با نحوه مشاهده سرویسهای در حال اجرا در لینوکس تحت systemd آشنا شدیم. همچنین بررسی کردیم که چگونه میتوان پورتهای در حال گوش دادن (listening ports) را شناسایی کرد و سرویسها یا پورتهای باز در فایروال سیستم را مشاهده نمود.
این اطلاعات به مدیران سیستم کمک میکند تا کنترل دقیقتری بر وضعیت سرویسها، امنیت شبکه و عملکرد کلی سیستم لینوکسی خود داشته باشند. با استفاده از ابزارهای systemd و دستورات مرتبط، میتوان بهراحتی از سلامت سرویسها و پیکربندی صحیح فایروال اطمینان حاصل کرد.