Systemctl چیست؟ آموزش مدیریت سرویس ها در لینوکس با systemd

در سیستم عامل لینوکس، برنامه ها و سرویس های مختلفی در پس زمینه اجرا میشوند و هر کدام وظیفه مشخصی بر عهده دارند. وب سرور، سرویس SSH، پایگاه داده و بسیاری از اجزای دیگر سیستم برای اجرا، توقف و مدیریت به ابزارهای مشخصی نیاز دارند. در بیشتر توزیع های مدرن لینوکس، systemd این وظیفه را بر عهده دارد و systemctl ابزار اصلی برای تعامل با آن از طریق خط فرمان است.
با استفاده از systemctl میتوان سرویس ها را اجرا، متوقف و راه اندازی مجدد کرد، وضعیت آنها را بررسی کرد و مشخص کرد که یک سرویس هنگام روشن شدن سیستم به صورت خودکار اجرا شود یا خیر. به همین دلیل، آشنایی با این ابزار برای مدیریت سرورهای لینوکس اهمیت زیادی دارد.
Systemctl چیست؟
systemctl یک ابزار خط فرمان برای مدیریت systemd و Unit های تحت مدیریت آن است. این ابزار به مدیر سیستم اجازه میدهد وضعیت سرویس ها را بررسی و دستورات مختلفی را برای کنترل آنها اجرا کند.
برای مثال، اگر Nginx روی یک سرور نصب شده باشد، میتوان وضعیت آن را با دستور زیر بررسی کرد:
systemctl status nginx
در این دستور، systemctl ابزار مدیریت systemd و status فرمان مورد نظر است. عبارت nginx نیز نام Unit مورد نظر را مشخص میکند.
systemctl فقط برای سرویس ها استفاده نمیشود و میتواند انواع مختلف Unit را نیز مدیریت کند. با این حال، مدیریت سرویس ها یکی از رایج ترین کاربردهای آن است.
systemd چیست و چه تفاوتی با systemctl دارد؟
systemd یک سیستم مدیریت سرویس و راه اندازی سیستم در لینوکس است. این سیستم وظایفی مانند راه اندازی سرویس ها، مدیریت وابستگی میان آنها و کنترل وضعیت بسیاری از اجزای سیستم را بر عهده دارد.
در مقابل، systemctl یک ابزار خط فرمان است که برای ارتباط با systemd استفاده میشود. به بیان ساده، systemd سرویس ها را مدیریت میکند و systemctl ابزاری است که مدیر سیستم از طریق آن به systemd دستور میدهد.
برای مثال، وقتی دستور زیر را اجرا میکنید:
systemctl restart nginx
systemctl درخواست Restart شدن سرویس Nginx را به systemd ارسال میکند و systemd این عملیات را انجام میدهد.
Unit در systemd چیست؟
systemd اجزای مختلف سیستم را در قالب Unit مدیریت میکند. سرویس ها فقط یکی از انواع Unit هستند و هر Unit میتواند وظیفه متفاوتی داشته باشد.
برخی از انواع مهم Unit عبارت اند از:
- Service: برای مدیریت سرویس ها و فرایندهای پس زمینه
- Socket: برای مدیریت Socket های مورد استفاده سرویس ها
- Mount: برای مدیریت نقاط Mount سیستم
- Timer: برای اجرای وظایف در زمان بندی مشخص
- Target: برای گروه بندی Unit ها و مشخص کردن وضعیت های مختلف سیستم
در کارهای روزمره مدیریت سرور، Service Unit ها بیشتر از سایر انواع مورد استفاده قرار میگیرند. برای مثال، Nginx، Apache و بسیاری از سرویس های دیگر معمولا به عنوان Service Unit در systemd تعریف میشوند.
بررسی وضعیت سرویس با systemctl
یکی از مهم ترین دستورات systemctl، دستور status است. این دستور اطلاعاتی درباره وضعیت فعلی یک سرویس نمایش میدهد.
systemctl status nginx
خروجی این دستور میتواند اطلاعاتی مانند فعال یا غیرفعال بودن سرویس، وضعیت اجرای آن، شناسه فرایند و بخشی از رویدادهای اخیر مربوط به سرویس را نشان دهد.
اگر سرویس در حال اجرا باشد، معمولا وضعیت active (running) نمایش داده میشود. در صورت توقف سرویس یا بروز خطا، وضعیت متفاوتی نمایش داده خواهد شد.
این دستور یکی از اولین ابزارهایی است که هنگام عیب یابی یک سرویس باید مورد استفاده قرار بگیرد.
اجرای سرویس با دستور start
برای اجرای یک سرویس که در حال حاضر متوقف است، از start استفاده میشود:
systemctl start nginx
اجرای این دستور باعث میشود systemd سرویس مورد نظر را در همان لحظه اجرا کند. نکته مهم این است که start به تنهایی تنظیمات اجرای خودکار سرویس هنگام روشن شدن سیستم را تغییر نمیدهد.
بنابراین اجرای سرویس و فعال کردن آن برای اجرای خودکار در زمان Boot دو عملیات متفاوت هستند.
متوقف کردن سرویس با stop
برای متوقف کردن یک سرویس در حال اجرا میتوان از stop استفاده کرد:
systemctl stop nginx
این دستور از systemd میخواهد سرویس مورد نظر را متوقف کند. پس از اجرای موفق دستور، سرویس دیگر در حال اجرا نخواهد بود؛ مگر اینکه عامل دیگری باعث اجرای مجدد آن شود.
راه اندازی مجدد سرویس با restart
گاهی پس از تغییر تنظیمات یک سرویس لازم است سرویس دوباره اجرا شود. برای این کار از restart استفاده میشود:
systemctl restart nginx
Restart باعث میشود سرویس متوقف و دوباره اجرا شود. این روش در مواقعی کاربرد دارد که سرویس برای اعمال تنظیمات جدید نیاز به راه اندازی مجدد داشته باشد.
با این حال، اگر سرویس مورد نظر از Reload پشتیبانی کند، همیشه لازم نیست برای اعمال تنظیمات آن را به طور کامل Restart کرد.
Reload چیست؟
reload برای بارگذاری مجدد تنظیمات سرویس استفاده میشود، بدون اینکه لزوما فرایند اصلی سرویس به طور کامل متوقف و دوباره اجرا شود.
برای مثال:
systemctl reload nginx
پشتیبانی از Reload به خود سرویس بستگی دارد. بنابراین نمیتوان فرض کرد که تمام سرویس های لینوکس این قابلیت را دارند.
تفاوت مهم این دو دستور را میتوان این طور خلاصه کرد: Restart سرویس را دوباره اجرا میکند، اما Reload از سرویس میخواهد تنظیمات خود را مجددا بارگذاری کند. در سرویس هایی که Reload را پشتیبانی میکنند، این روش میتواند از توقف کامل سرویس جلوگیری کند.
enable در systemctl چیست؟
اجرای یک سرویس در حال حاضر با اجرای خودکار آن پس از Boot تفاوت دارد. برای مشخص کردن اینکه یک سرویس هنگام راه اندازی سیستم به صورت خودکار اجرا شود، از enable استفاده میشود:
systemctl enable nginx
دستور enable معمولا لینک ها و تنظیمات لازم را ایجاد میکند تا systemd سرویس را در زمان مناسب هنگام راه اندازی سیستم اجرا کند.
نکته مهم این است که enable لزوما سرویس را در همان لحظه اجرا نمیکند. اگر سرویس هم اکنون اجرا نشده باشد، اجرای enable به تنهایی آن را Start نمیکند.
اجرای همزمان enable و start
اگر بخواهید سرویس هم در همان لحظه اجرا شود و هم برای اجرای خودکار هنگام Boot فعال شود، میتوانید از گزینه --now استفاده کنید:
systemctl enable --now nginx
این روش برای سرویس هایی که میخواهید هم اکنون فعال باشند و پس از Restart یا روشن شدن مجدد سرور نیز به صورت خودکار اجرا شوند، کاربردی است.
غیرفعال کردن اجرای خودکار سرویس
برای جلوگیری از اجرای خودکار یک سرویس هنگام راه اندازی سیستم میتوان از disable استفاده کرد:
systemctl disable nginx
این دستور تنظیمات مربوط به اجرای خودکار سرویس را غیرفعال میکند، اما لزوما سرویس در حال اجرا را متوقف نمیکند.
اگر هدف شما هم غیرفعال کردن اجرای خودکار و هم متوقف کردن سرویس باشد، میتوانید از --now استفاده کنید:
systemctl disable --now nginx
فعال یا غیرفعال بودن سرویس را چگونه بررسی کنیم؟
برای مشاهده وضعیت فعال سازی سرویس میتوان از is-enabled استفاده کرد:
systemctl is-enabled nginx
این دستور مشخص میکند که سرویس برای اجرای خودکار هنگام راه اندازی سیستم فعال شده است یا خیر.
برای بررسی اینکه سرویس در حال حاضر اجرا میشود نیز میتوان از is-active استفاده کرد:
systemctl is-active nginx
این دو دستور کاربرد متفاوتی دارند. is-enabled درباره وضعیت اجرای خودکار سرویس هنگام Boot است، در حالی که is-active وضعیت فعلی سرویس را بررسی میکند.
مشاهده سرویس های فعال با systemctl
برای مشاهده Service Unit هایی که در حال حاضر در سیستم بارگذاری شده اند، میتوان از دستور زیر استفاده کرد:
systemctl list-units --type=service
اگر هدف مشاهده فایل های Unit مربوط به سرویس ها و وضعیت فعال سازی آنها باشد، میتوان از دستور زیر استفاده کرد:
systemctl list-unit-files --type=service
این دو دستور یکسان نیستند. list-units روی Unit هایی تمرکز دارد که systemd آنها را در حال حاضر بارگذاری کرده است، در حالی که list-unit-files فایل های Unit موجود در سیستم و وضعیت فعال سازی آنها را نمایش میدهد.
daemon-reload در systemctl چیست؟
گاهی فایل های Unit مربوط به systemd به صورت دستی تغییر میکنند یا یک سرویس فایل Unit جدیدی نصب میکند. در چنین شرایطی systemd باید فایل های Unit را دوباره بخواند.
برای این کار میتوان از daemon-reload استفاده کرد:
systemctl daemon-reload
این دستور سرویس ها را Restart نمیکند. وظیفه آن این است که systemd را وادار کند فایل های Unit را دوباره بارگذاری کند.
برای مثال، اگر فایل Unit یک سرویس را تغییر داده باشید، ممکن است لازم باشد ابتدا daemon-reload اجرا شود و سپس سرویس را Restart کنید:
systemctl daemon-reload systemctl restart nginx
البته اجرای daemon-reload برای هر تغییر در تنظیمات خود نرم افزار ضروری نیست و بیشتر زمانی مطرح میشود که فایل های Unit یا تنظیمات مرتبط با systemd تغییر کرده باشند.
مشاهده لاگ سرویس ها با journalctl
systemctl برای بررسی وضعیت سرویس بسیار کاربردی است، اما برای مشاهده و تحلیل کامل تر لاگ های systemd معمولا از ابزار journalctl استفاده میشود.
برای مشاهده گزارش های مربوط به یک سرویس میتوان از دستور زیر استفاده کرد:
journalctl -u nginx
برای مشاهده گزارش های جدید به صورت لحظه ای نیز میتوان از -f استفاده کرد:
journalctl -u nginx -f
این قابلیت هنگام عیب یابی سرویس هایی که با خطا متوقف میشوند بسیار مفید است. ترکیب اطلاعات systemctl status با گزارش های journalctl معمولا تصویر دقیق تری از مشکل ارائه میدهد.
چگونه یک سرویس را هنگام Boot فعال کنیم؟
برای اجرای خودکار یک سرویس پس از راه اندازی سیستم، ابتدا باید آن را با enable فعال کنید:
systemctl enable nginx
اگر میخواهید سرویس هم اکنون نیز اجرا شود، روش ساده تر استفاده از --now است:
systemctl enable --now nginx
برای اطمینان از فعال بودن سرویس برای اجرای خودکار نیز میتوانید وضعیت آن را بررسی کنید:
systemctl is-enabled nginx
عیب یابی سرویس ها با systemctl
زمانی که یک سرویس روی سرور اجرا نمیشود، بهتر است به جای Restart های پیاپی، ابتدا وضعیت آن را بررسی کنید. برای مثال:
systemctl status nginx
اگر در خروجی خطایی مشاهده شد، میتوان گزارش های دقیق تر را با journalctl بررسی کرد:
journalctl -u nginx
همچنین در صورتی که فایل Unit تغییر کرده باشد، ابتدا باید systemd را از تغییرات مطلع کرد:
systemctl daemon-reload
پس از آن، بسته به نوع تغییر، میتوان سرویس را دوباره اجرا یا Reload کرد.
این روش باعث میشود فرایند عیب یابی بر اساس اطلاعات واقعی سرویس انجام شود و صرفا با اجرای مجدد آن، علت مشکل پنهان نشود.
آیا systemctl روی همه توزیع های لینوکس وجود دارد؟
systemctl مخصوص systemd است. بنابراین در سیستم هایی که از systemd به عنوان سیستم مدیریت سرویس و init استفاده میکنند، این ابزار قابل استفاده است.
بسیاری از توزیع های رایج لینوکس مانند Ubuntu، Debian، Fedora و RHEL از systemd استفاده میکنند. با این حال، همه محیط های لینوکس الزامیتی برای استفاده از systemd ندارند و بعضی توزیع ها یا سیستم های خاص ممکن است از سیستم init دیگری استفاده کنند.
در چنین محیط هایی، systemctl لزوما ابزار مدیریت سرویس ها نخواهد بود.
تفاوت دستورات مهم systemctl در یک نگاه
دستورهای systemctl هر کدام وظیفه مشخصی دارند و نباید آنها را جایگزین یکدیگر در نظر گرفت:
startسرویس را اجرا میکند.stopسرویس را متوقف میکند.restartسرویس را متوقف و دوباره اجرا میکند.reloadتنظیمات سرویس را در صورت پشتیبانی مجددا بارگذاری میکند.enableاجرای خودکار سرویس هنگام Boot را فعال میکند.disableاجرای خودکار سرویس هنگام Boot را غیرفعال میکند.statusوضعیت سرویس را نمایش میدهد.is-activeفعال بودن فعلی سرویس را بررسی میکند.is-enabledفعال بودن سرویس برای اجرای خودکار هنگام Boot را بررسی میکند.daemon-reloadفایل های Unit را دوباره در systemd بارگذاری میکند.
Systemctl چه نقشی در مدیریت سرور لینوکس دارد؟
systemctl یکی از ابزارهای پایه برای مدیریت سرویس ها در سیستم های لینوکسی مبتنی بر systemd است. مدیر سرور میتواند با استفاده از آن سرویس های ضروری مانند وب سرور، سرویس SSH یا پایگاه داده را کنترل و وضعیت آنها را بررسی کند.
شناخت تفاوت میان اجرای سرویس، فعال کردن آن هنگام Boot و Reload کردن تنظیمات نیز اهمیت زیادی دارد. برای مثال، start باعث اجرای سرویس میشود، اما برای اجرای خودکار آن پس از راه اندازی سیستم باید از enable استفاده کرد.
در زمان بروز مشکل نیز systemctl به تنهایی تنها بخشی از اطلاعات مورد نیاز را ارائه میدهد. بررسی وضعیت سرویس با systemctl status و مشاهده گزارش های مربوط به آن با journalctl معمولا نقطه شروع مناسبی برای پیدا کردن علت خطا است.
به همین دلیل، آشنایی با systemctl برای هر کسی که با مدیریت سرورهای لینوکس سروکار دارد، یک مهارت پایه و کاربردی محسوب میشود.
سوالات متداول
systemctl ابزار خط فرمان برای مدیریت systemd و Unit های تحت مدیریت آن است. با استفاده از آن میتوان سرویس ها را اجرا، متوقف، Restart و بررسی کرد و وضعیت اجرای خودکار آنها هنگام Boot را نیز تغییر داد.
ابزار systemd سیستم مدیریت سرویس ها و فرایند راه اندازی سیستم در لینوکس است، در حالی که systemctl ابزار خط فرمانی برای تعامل با systemd و مدیریت Unit های آن محسوب میشود.
start یک سرویس را در همان لحظه اجرا میکند، اما enable سرویس را برای اجرای خودکار در زمان راه اندازی سیستم فعال میکند. این دو عملیات مستقل از یکدیگر هستند.
restart سرویس را دوباره راه اندازی میکند، اما reload از سرویس میخواهد پیکربندی خود را دوباره بارگذاری کند. پشتیبانی و نحوه عملکرد Reload به خود سرویس بستگی دارد.
reload برای درخواست بارگذاری مجدد پیکربندی خود سرویس استفاده میشود، در حالی که daemon-reload پیکربندی Manager مربوط به systemd و فایل های Unit را دوباره بارگذاری میکند. این دو دستور کاربرد یکسانی ندارند.
خیر. systemctl به systemd وابسته است و در سیستم هایی که از systemd استفاده نمیکنند، ابزار اصلی مدیریت سرویس ها نخواهد بود. بسیاری از توزیع های رایج لینوکس امروزی از systemd استفاده میکنند.




























شما میتوانید دیدگاه خود را در مورد این مطلب با ما با اشتراک بگذارید.