در مدیریت سرور مجازی لینوکس، بسیاری از قابلیتها مثل وبسرور، پایگاه داده، سرویس SSH و زمانبندی کارها به سرویسهایی وابستهاند که باید در زمان مناسب اجرا شوند. دستور systemctl ابزار رایج مدیریت این سرویسها در سیستمهایی است که از systemd استفاده میکنند. با کمک آن میتوانید وضعیت سرویس را ببینید، آن را شروع یا متوقف کنید، اجرای مجدد انجام دهید و مشخص کنید که سرویس پس از روشن شدن سرور بهصورت خودکار اجرا شود یا نه. این کارها برای عیبیابی خطاها و نگهداری سرور اهمیت زیادی دارند؛ دستور systemctl به شما کمک میکند بدون مراجعه به ابزار گرافیکی وضعیت سرویس را از ترمینال کنترل کنید، بهخصوص زمانی که یک وبسایت یا برنامه بهدرستی پاسخ نمیدهد.
در این مقاله، کاربرد دستورهای اصلی را با مثالهای قابل اجرا مرور میکنیم و تفاوت چند فرمان مشابه را توضیح میدهیم تا هنگام تغییر وضعیت سرویس، ناخواسته باعث قطعی یا تغییر رفتار سیستم نشوید.


دستور systemctl چیست و چه کاربردی دارد؟
دستور systemctl ابزار خط فرمانی برای ارتباط با مدیر سیستم و سرویس systemd است. در بسیاری از توزیعهای جدید لینوکس، systemd مسئول راهاندازی سیستم و مدیریت سرویسهای پسزمینه است و systemctl امکان کنترل آنها را فراهم میکند. سرویسها معمولاً با واحدهایی (Unit) معرفی میشوند که میتوانند از نوع service، socket، timer، mount و موارد دیگر باشند. در این مقاله تمرکز بر واحدهای سرویس با پسوند .service است.
تفاوت systemd و systemctl
systemd مدیر سرویسها و اجزای راهاندازی سیستم است؛ اما systemctl فرمانی است که مدیر سرور از طریق ترمینال برای ارسال درخواست به systemd استفاده میکند. برای اجرای دستورهای مدیریتی معمولاً باید از sudo استفاده کنید. در مثالهای این آموزش نام nginx.service بهعنوان نمونه آمده است؛ آن را با نام سرویس واقعی روی سیستم خود جایگزین کنید.
بررسی وضعیت سرویسها در لینوکس
پیش از تغییر وضعیت یک سرویس، بهتر است ابتدا بررسی کنید که در حال اجراست یا با خطا روبهرو شده است. یکی از کاربردهای پرمصرف دستور systemctl مشاهده همین اطلاعات است. دستور systemctl status جزئیات مفیدی مانند وضعیت فعلی، شناسه پردازش و بخشی از پیامهای ثبتشده را نمایش میدهد.
مشاهده وضعیت یک سرویس
برای بررسی وضعیت Nginx، دستور زیر را اجرا کنید:
sudo systemctl status nginx
اگر سرویس فعال باشد، معمولاً عبارتی مانند active (running) دیده میشود. وضعیت inactive (dead) یعنی سرویس در حال اجرا نیست و failed معمولاً به این معناست که اجرای آن با خطا مواجه شده است. خروجی دقیق با توجه به سرویس و توزیع لینوکس ممکن است متفاوت باشد. اگر پیام Unit could not be found نمایش داده شد، احتمال دارد نام واحد اشتباه باشد یا سرویس نصب نشده باشد.
فهرست سرویسهای فعال و فایلهای سرویس
برای دیدن واحدهای فعال و بارگذاریشده میتوانید از این دستور استفاده کنید:
systemctl list-units --type=service
این فهرست بهطور پیشفرض همه فایلهای سرویس نصبشده را نمایش نمیدهد؛ برای دیدن فایلهای واحد و وضعیت فعالسازی آنها هنگام بوت، دستور زیر کاربرد دارد:
systemctl list-unit-files --type=service
در خروجی دستور دوم، وضعیتهایی مثل enabled، disabled یا static دیده میشوند. enabled یعنی واحد برای اجرا در شرایط تعریفشده هنگام راهاندازی سیستم فعال شده است؛ disabled یعنی به این شکل فعال نشده و static معمولاً نشان میدهد واحد بخش نصب مستقلی برای فعالسازی مستقیم ندارد. این وضعیتها بهتنهایی نمیگویند که سرویس همین حالا در حال اجراست؛ برای آن باید وضعیت فعال سرویس را جداگانه بررسی کنید.


شروع، توقف و راهاندازی مجدد سرویسها
پس از شناسایی سرویس، دستور systemctl میتواند وضعیت اجرای آن را تغییر دهد. قبل از توقف یا راهاندازی مجدد سرویسهای مهم، مطمئن شوید که اثر آن بر برنامهها و کاربران را میدانید؛ برای مثال توقف وبسرور میتواند دسترسی به وبسایت را مختل کند.
فهرست سرویسهای فعال و فایلهای سرویس
برای شروع فوری سرویس Nginx با دستور systemctl از فرمان زیر استفاده کنید:
sudo systemctl start nginx
این فرمان از systemd میخواهد سرویس را اجرا کند. معمولاً در صورت موفقیت خروجی متنی خاصی نمایش داده نمیشود؛ برای اطمینان، وضعیت سرویس را با دستور زیر بررسی کنید:
sudo systemctl status nginx
برای متوقف کردن سرویس، دستور زیر را اجرا کنید:
sudo systemctl stop nginx
این کار سرویس را متوقف میکند، اما بهخودیخود جلوی اجرای آن در بوت بعدی را نمیگیرد. اگر سرویس تحت وابستگی یا تنظیمات دیگری دوباره فعال شود، ممکن است مجدداً اجرا شود.
تفاوت restart، reload و daemon-reload
در میان زیرفرمانهای دستور systemctl، گزینه restart سرویس را متوقف و دوباره اجرا میکند. در نتیجه ممکن است یک وقفه کوتاه در دسترسی ایجاد شود. برای راهاندازی مجدد سرویس نمونه، از فرمان زیر استفاده کنید:
sudo systemctl restart nginx
دستور reload از خود سرویس میخواهد تنظیمات برنامه را دوباره بارگذاری کند، بدون آنکه لزوماً کل پردازش متوقف و از نو اجرا شود. این قابلیت تنها زمانی کار میکند که سرویس از بارگذاری مجدد پشتیبانی کند:
sudo systemctl reload nginx
اما daemon-reload برای زمانی است که فایل واحد systemd را تغییر داده یا واحد جدیدی اضافه کردهاید. این فرمان تنظیمات واحدها را دوباره میخواند؛ بهتنهایی سرویس را restart نمیکند و لزوماً تنظیمات خود برنامه را هم بارگذاری نمیکند:
sudo systemctl daemon-reload
بنابراین، پس از ویرایش فایل واحد سرویس معمولاً ابتدا daemon-reload اجرا میشود و سپس، اگر تغییرات نیاز داشته باشند، سرویس را reload یا restart میکنید. در مقابل، برای اعمال تغییر در فایل پیکربندی خود برنامه، باید از سازوکار مخصوص همان سرویس استفاده کنید.
مدیریت اجرای خودکار سرویسها هنگام بوت
اجرای فوری سرویس با فعال بودن آن در زمان راهاندازی سیستم یکسان نیست. برای فعال کردن اجرای خودکار یک سرویس در بوت بعدی، دستور systemctl را همراه گزینه enable اجرا کنید:
sudo systemctl enable nginx
این دستور تنظیمات لازم برای فعالسازی خودکار سرویس را ایجاد میکند، اما لزوماً آن را همین حالا اجرا نمیکند. برای فعال کردن اجرای خودکار و شروع فوری سرویس بهصورت همزمان، گزینه --now را اضافه کنید:
sudo systemctl enable --now nginx
برای لغو فعالسازی خودکار در بوتهای بعدی، میتوانید از disable استفاده کنید:
sudo systemctl disable nginx
این فرمان بهتنهایی سرویس در حال اجرا را متوقف نمیکند. اگر قصد دارید هم اجرای خودکار آینده را لغو کنید و هم سرویس همین حالا متوقف شود، دستور زیر این دو کار را انجام میدهد:
sudo systemctl disable --now nginx
پیش از اجرای این دستور روی سرویسهای ضروری، مطمئن شوید که توقف آن مشکلی برای دسترسی یا عملکرد سرور ایجاد نمیکند. برای بررسی وضعیت فعالسازی خودکار هم میتوانید از دستور زیر کمک بگیرید:
systemctl is-enabled nginx
خروجی معمول enabled یا disabled است؛ در برخی شرایط ممکن است وضعیتهای دیگری مثل static نیز برگردد.




























بدون دیدگاه