چگونگی مدیریت سرویس‌ها با systemctl

این مقاله با هدف بررسی ، نحوه کنترل سیستم و سرویس‌ها در سیستم عامل‌هایی که در آن‌ها systemd اجرا می‌شوند ایجاد شده است. 

4 285
امتیاز به مطلب
[تعداد: 3   میانگین:  5/5]

این مقاله با هدف بررسی ، نحوه کنترل سیستم و سرویس‌ها در سیستم عامل‌هایی که در آن‌ها systemd اجرا می‎شوند ایجاد شده است .

systemd چیست ؟

systemd یک مدیر (manager) برای سیستم و سرویس‌های لینوکسی بوده که با تمامی سیستم‌های LSB و sysV سازگاری دارد و محاسن ذکر شده در زیر را در اختیار سیستم قرار میدهد .

  1. systemd قابلیت پردازش موازی پویا را فراهم می‌کند
  2. برای استارت سرویس‎‌ها از فعالیت‌های D-bus و سوکت‌ها استفاده می‌کند
  3. استارت سرویس‌ها بر اساس تقاضا(on-demand)
  4. پردازش‌ها را با استفاده از کنترل گروپ لینوکس ردیابی می‌کند
  5. پشتیبانی از snapshotting و بازگرداندن حالت سیستم
  6. نگه داشتن نقاط mount و automount و پیاده سازی یک منطق کنترل سرویس مبتنی بر وابستگی متقابل

در systemd به تمامی سرویس‌ها،سوکت‌ها،مونت پوینت‌ها،دیوایس‌ها یونیت(unit) گفته می‎شود.

در اکوسیستم لینوکسی systemd در اکثر توزیع‌های لینوکس با کمی استثنا پیاده‌سازی شده است .

systemd در centos 7 جایگزین sysVinit شده است که همین امر باعث بوت (راه اندازی اولیه سیستم عامل) سریعتر این سیستم عامل شده است چرا که systemd از اسکریپت‌های کمتری استفاده می‌کند و همچنین بیشتر عملیات‌ها (task) را به طور همزمان (موازی) اجرا می‌کند .

systemctl چیست ؟

systemctl یک ابزار سیستمی برای مدیریت و کنترل systemd است.

شروع کار با systemd و systemctl

برای قدم اول شروع کار با systemd با استفاده از کامند زیر بررسی می‌کنیم که آیا بر روی توزیع لینوکس مورد نظر systemd نصب هست یا خیر و چه نسخه ای از آن در سیستم عامل لینوکس ما نصب است.

#debian based system
systemd --version
#rhel based system
systemctl --version

خروجی کامند بالا در صورتی که بر روی توزیع در حال کار شما systemd فعال باشد مشابه زیر خواهد بود که در این سیستم systemd نسخه ۲۱۹ فعال است.

systemd 219
+PAM +AUDIT +SELINUX +IMA -APPARMOR +SMACK +SYSVINIT +UTMP +LIBCRYPTSETUP +GCRYPT +GNUTLS +ACL +XZ +LZ4 -SECCOMP +BLKID +ELFUTILS +KMOD +IDN

در صورتی که پیام دیگری مانند -bash: systemd: command not found مشاهده نمودید به این معناست که در توزیع یا نسخه توزیع شما از systemd استفاده نشده و احتمالا هنوز بر پایه sysV در حال فعالیت است مانند Centos 5

مسیر لایبراری‎ها و فایلهای کانفیگ systemctl و systemd

systemctl و systemd نیز مانند سایر ابزارهای لینوکس از طریق لایبراری‌ها و فایل‌های کانفیگ بر روی لینوکس فعالیت کرده و کنترل می‎شوند که با استفاده از دستور زیر می‌توانید مسیر آن‌ها را بیابید .

whereis systemctl
systemctl: /usr/bin/systemctl /usr/share/man/man1/systemctl.1.gz
whereis systemd
systemd: /usr/lib/systemd /etc/systemd /usr/include/systemd /usr/share/systemd /usr/share/man/man1/systemd.1.gz

نکته: کامند whereis به معنای کجاست را می‌توانید برای سایر سرویس‌ها یا ابزارهای لینوکس نیز استفاده کنید و به کمک آن مسیر ذخیره فایل‌های آن سرویس یا ابزار را پیدا کنید که در این خصوص حتما در مقاله جداگانه در آینده نزدیک صحبت خواهیم کرد .

بررسی فعال(run) بودن  systemd

ps -eaf | grep [s]ystemd

اگر پس از اجرای دستور فوق خروجی مشاهده نکردید که البته در صورت فعال بودن systemd در سیستم شما این امر تقریبا غیر ممکن است مگر در شرایط خاص و احتمالا بحرانی (با فرض اینکه در توزیع شما systemd وجود دارد) به این معناست که systemd غیر فعال شده و در حال فعالیت نیست، در غیر اینصورت خروجی ای مشابه زیر را مشاهده خواهید کرد .

root           1       0  0 Jun09 ?        00:01:56 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
root        2617       1  0 Jun09 ?        00:03:32 /usr/lib/systemd/systemd-journald
root        2651       1  0 Jun09 ?        00:00:00 /usr/lib/systemd/systemd-udevd
root        5052       1  0 Jun09 ?        00:00:48 /usr/lib/systemd/systemd-logind
dbus        5055       1  0 Jun09 ?        00:02:06 /usr/bin/dbus-daemon --system --address=systemd: --nofork --nopidfile --system -activation

در خصوص دستور ps که در این کامند استفاده شده است در آینده صحبت خواهیم کرد، در خروجی بالا systemd به عنوان یک پراسس والد با شناسه (id) 1 در حال اجرا است .

تجزیه تحلیل روند بوت systemd

با استفاده از دستور systemd-analyze می‎توانید زمان تقریبی بوت سیستم عامل را متوجه شوید. که خروجی مشابه زیر خواهد داشت

Startup finished in 487ms (kernel) + 2.776s (initrd) + 20.229s (userspace) = 23.493s

تجزیه و تحلیل زمان بوت شدن هر یک از یونیت‎ها

با استفاده از دستور systemd-analyze blame زمان صرف شده به ازای هر یونیت از ابتدای فرایند آغاز به کار تا اتمام آن و فعال شدن کامل را مانند خروجی زیر مشاهده خواهید کرد.

mariadb.service 7.991 s
webmin.service 6.095 s
postfix.service 4.311 s
httpd.service 3.926 s
firewalld.service 3.780 s
kdump.service 3.238 s
tuned.service 1.712 s
network.service 1.394 s
lvm2-monitor.service 1.26 s
systemd-logind.service 8.556 s
...

تجزیه و تحلیل زنجیره حیات در بوت شدن

The time after the unit is active or started is printed after the "@" character.
The time the unit takes to start is printed after the "+" character.

multi-user.target @20.222s
└─mariadb.service @11.657s +8.565s
  └─network.target @11.168s
    └─network.service @9.456s +1.712s
      └─NetworkManager.service @8.858s +596ms
        └─firewalld.service @4.931s +3.926s
          └─basic.target @4.916s
            └─sockets.target @4.916s
              └─dbus.socket @4.916s
                └─sysinit.target @4.905s
                  └─systemd-update-utmp.service @4.864s +39ms
                    └─auditd.service @4.563s +301ms
                      └─systemd-tmpfiles-setup.service @4.485s +69ms
                        └─rhel-import-state.service @4.342s +142ms
                          └─local-fs.target @4.324s
                            └─boot.mount @4.286s +31ms
                              └─systemd-fsck@dev-disk-by\x2duuid-79f594ad\x2da332\x2d4730\x2dbb5f\x2d85d19608096
                                └─dev-disk-by\x2duuid-79f594ad\x2da332\x2d4730\x2dbb5f\x2d85d196080964.device @4

زمان ذکر شده در خروجی بالا که پس از علامت @ آمده است زمان شروع یا فعال شدن آن بوده و زمان ذکر شده پس از علامت + زمان صرف شده برای فعال شدن یونیت می‌باشد .

دریافت لیست تمام یونیت‎ها

با دستور systemctl list-unit-files لیست تمامی یونیت‎های روی سیستم را مانند خروجی زیر مشاهده می‌کنید

UNIT FILE                                     STATE
proc-sys-fs-binfmt_misc.automount             static
dev-hugepages.mount                           static
dev-mqueue.mount                              static
proc-sys-fs-binfmt_misc.mount                 static
sys-fs-fuse-connections.mount                 static
sys-kernel-config.mount                       static
sys-kernel-debug.mount                        static
tmp.mount                                     disabled
brandbot.path                                 enabled
systemd-ask-password-console.path             static
....

دریافت لیست تمام یونیت‎های در حال اجرا

با دستور systemctl list-units تمامی یونیت‌هایی که در حال حاضر فعال هستند را مشاهده خواهید کرد که خروجی به شکل زیر است.

UNIT                                                 LOAD   ACTIVE SUB       DESCRIPTION
 proc-sys-fs-binfmt_misc.automount                    loaded active waiting   Arbitrary Executable File Formats File System Automo
 sys-devices-pci0000:00-0000:00:01.0-0000:01:00.0-host5-port\x2d5:0-end_device\x2d5:0-target5:0:0-5:0:0:0-block-sdc-sdc1.device lo
 sys-devices-pci0000:00-0000:00:01.0-0000:01:00.0-host5-port\x2d5:0-end_device\x2d5:0-target5:0:0-5:0:0:0-block-sdc-sdc2.device lo
 sys-devices-pci0000:00-0000:00:01.0-0000:01:00.0-host5-port\x2d5:0-end_device\x2d5:0-target5:0:0-5:0:0:0-block-sdc-sdc3.device lo
 sys-devices-pci0000:00-0000:00:01.0-0000:01:00.0-host5-port\x2d5:0-end_device\x2d5:0-target5:0:0-5:0:0:0-block-sdc.device loaded
 sys-devices-pci0000:00-0000:00:01.0-0000:01:00.0-host5-port\x2d5:1-end_device\x2d5:1-target5:0:1-5:0:1:0-block-sdd-sdd1.device lo
 sys-devices-pci0000:00-0000:00:01.0-0000:01:00.0-host5-port\x2d5:1-end_device\x2d5:1-target5:0:1-5:0:1:0-block-sdd.device loaded
 sys-devices-pci0000:00-0000:00:1a.7-usb1-1\x2d4-1\x2d4:1.0-host4-target4:0:0-4:0:0:0-block-sr1.device loaded active plugged   Vir
 sys-devices-pci0000:00-0000:00:1a.7-usb1-1\x2d4-1\x2d4:1.0-host4-target4:0:0-4:0:0:1-block-sda.device loaded active plugged   Vir
 sys-devices-pci0000:00-0000:00:1a.7-usb1-1\x2d4-1\x2d4:1.0-host4-target4:0:0-4:0:0:2-block-sdb.device loaded active plugged   Vir
 sys-devices-pci0000:00-0000:00:1c.0-0000:0b:00.0-net-ens1f0.device loaded active plugged   82576 Gigabit Network Connection
 sys-devices-pci0000:00-0000:00:1c.0-0000:0b:00.1-net-ens1f1.device loaded active plugged   82576 Gigabit Network Connection
 sys-devices-pci0000:00-0000:00:1f.5-ata4-host3-target3:0:0-3:0:0:0-block-sr0.device loaded active plugged   HL-DT-ST_DVDRAM_GT51N

لیست تمام یونیت‌های از کار افتاده

با زدن کامند systemctl --failed در محیط شل نیز میتوانید به سادگی تمامی یونیت‌های متوقف شده را یافته و نسبت به انجام عملیات مورد نظر برای رفع مشکل آن‌ها اقدام کنید که خروجی مشابه زیر خواهد داشت.

UNIT            LOAD   ACTIVE SUB    DESCRIPTION
● mariadb.service loaded failed failed MariaDB 10.1.36 database server

LOAD   = Reflects whether the unit definition was properly loaded.
ACTIVE = The high-level unit activation state, i.e. generalization of SUB.
SUB    = The low-level unit activation state, values depend on unit type.

۱ loaded units listed. Pass --all to see loaded but inactive units, too.
To show all installed unit files use 'systemctl list-unit-files'.

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

با ارسال کامند systemctl is-enabled mariadb.service متوجه خواهید شد که یک یونیت یا سرویس به صورت استارت خودکار یا اوتو‎لود در سیستم شما فعال هست یا خیر که در پاسخ کلمه enable در صورت فعال بودن و کلمه disabled در صورت غیر فعال بودن چاپ خواهد شد.

بررسی وضعیت یک سرویس یا یونیت

پیشنهاد میکنیم این مقاله را نیز بخوانید :

جهت بررسی وضعیت یک سرویس یا یونیت از کامند systemctl status firewalld.service استفاده می‌کنیم که در صورت فعال نبودن آن خروجی مانند زیر خواهد بود

● firewalld.service
   Loaded: masked (/dev/null; bad)
   Active: inactive (dead)

و در صورت فعال بودن یک سرویس خروجی مشابه خروجی زیر را مشاهده میکنید

● mysqld.service - MariaDB database server
   Loaded: loaded (/etc/systemd/system/mysqld.service; enabled; vendor preset: disabled)
   Active: active (running) since Sun 2019-06-09 18:50:34 +0430; 1 weeks 0 days ago
 Main PID: 120155 (mysqld)
   Status: "Taking your SQL requests now..."
   CGroup: /system.slice/mysqld.service
           └─۱۲۰۱۵۵ /usr/sbin/mysqld

نحوه مدیریت و کنترل سرویس‌ها با استفاده systemctl

تا به اینجا با برخی از دستورات systemctl و مکانیزم systemd آشنا شدیم اما بخش بسیار مهم و کاربردی کامند systemctl نحوه مدیریت سرویس‏‌ها و کنترل آن‌ها است که در ادامه به آن خواهیم پرداخت .

لیست تمامی سرویس‌های فعال و غیرفعال سیستم

برای دریافت لیست سرویس‌ها از دستور systemctl list-unit-files --type=service استفاده می‌کنیم که خروجی آن مشابه زیر خواهد بود، باید بدانید که ستون state وضعیت اوتو‎استارت بودن سرویس در زمان بوت سیستم را نمایش میدهد.

UNIT FILE                                     STATE
alt-php53-fpm.service                         disabled
alt-php54-fpm.service                         disabled
alt-php55-fpm.service                         disabled
alt-php56-fpm.service                         disabled
alt-php70-fpm.service                         disabled
alt-php70-newrelic-daemon.service             disabled
alt-php71-fpm.service                         disabled
alt-php71-newrelic-daemon.service             disabled
alt-php72-fpm.service                         disabled
alt-php72-newrelic-daemon.service             disabled
alt-php73-fpm.service                         disabled
alt-php73-newrelic-daemon.service             disabled
arp-ethers.service                            disabled
auditd.service                                enabled
.....

نکته : در صورتی که میخواهید در لیست بالا سرویس‌هایی با state یا وضعیت خاص مانند enabled را فیلتر کنید تا فقط یویت‌های دارای وضعیت مورد نظر نمایش داده شوند میتوانید به این شکل systemctl list-unit-files --type=service --state=enabled عمل کنید .

وضعیت mask در ستون state لیست سرویس‌ها یا یونیت‌ها به معنی غیر‎قابل استارت است، یعنی این یونیت به صورت دستی یا حتی با درخواست سایر سرویس‌ها/نرم‎افزار‎ها نیز قابل اجرا یا استارت نخواهند بود.

چگونه سرویس‌ها را در systemctl استارت،استاپ،ری‎استارت،ریلود کنیم

برای این منظور می‌توانید از دستورات زیر استفاده کنید، با توجه به مشخص بودن عملیات انجام شده توسط هر کامند از توضیح آن چشم پوشی می‌کنیم.

systemctl start httpd.service
systemctl restart httpd.service
systemctl stop httpd.service
systemctl reload httpd.service
#مشاهده وضعیت سرویس
systemctl status httpd.service

چگونه یک سرویس را به وضعیت فعال یا غیرفعال تغییر دهیم (اوتو‎استارت در زمان بوت سیستم)

برای اینکه یک سرویس در زمان بوت سیستم به صورت خودکار استارت شود از کامند systemctl enable httpd.service و برای اینکه یک سرویس از حالت اوتو‎استارت خارج شود از دستور systemctl disable httpd.service استفاده می‌کنیم و همچنین برای اینکه یک سرویس غیر‎قابل استارت شود از کامند systemctl mask httpd.service استفاده میکنیم و برای خارج کردن از حالت غیر‎قابل استارت نیز از کامند systemctl unmask httpd.service استفاده میکنیم.

چگونه یک سرویس را با systemctl میتوانیم kill کنیم

حتما میدانید که kill در سیستم‎های نرم افزاری به معنای توقف فوری یک پردازش است که البته خود kill با چند متد مختلف قابل اجرا است که هر یک از آن‌ها توضیحات مربوط به خود را داشته که می‌طلبد در پستی مجزا در این خصوص توضیح دهیم. از طریق systemctl و کامند systemctl kill httpd میتوانید یک سرویس را kill کنید.

 

مدیریت نقاط mount با استفاده از systemctl

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

ابزار پر‎قدرت systemctl در مدیریت mount point نیز به شما کمک میکند که در ادامه به آن خواهیم پرداخت.

لیست تمامی نقاط mount

با استفاده از دستور systemctl list-unit-files --type=mount لیست نقاط مانت را دریافت می‌کنید که خروجی مانند زیر خواهد بود .

UNIT FILE                     STATE
dev-hugepages.mount           static
dev-mqueue.mount              static
proc-sys-fs-binfmt_misc.mount static
sys-fs-fuse-connections.mount static
sys-kernel-config.mount       static
sys-kernel-debug.mount        static
tmp.mount                     disabled

چگونگی استاپ،استارت،ریلود و دریافت وضعیت یک نقطه مانت

با استفاده از دستورات زیر میتوانید عملیات‌های ذکر شده را انجام دهید.

systemctl start tmp.mount
systemctl stop tmp.mount
systemctl restart tmp.mount
systemctl reload tmp.mount
systemctl status tmp.mount

نحوه فعال یا غیر فعال کردن یک نقطه مانت در زمان بوت سیستم(اوتو‎ مانت)

دستورات زیر همانند مورد مربوط به سرویس‌ها جهت اوتو مانت نیز کارایی دارند is-active جهت بررسی وضعیت کنونی یک مانت پوینت می‌باشد

systemctl is-active tmp.mount
systemctl enable tmp.mount
systemctl disable  tmp.mount
systemctl mask tmp.mount
systemctl unmask tmp.mount

 

نحوه مدیریت و کنترل سوکت‌ها با استفاده از systemctl

همانطور که در مورد نقاط مانت مشاهده کردید تمامی دستورات و کارکرد کامند systemctl در مورد نقاط مانت مشابه مورد قبلی در کنترل سرویس‌ها بود، با این تفاوت که در تمامی کامند‌ها کلمه mount را جایگزین کلمه service کردیم. در خصوص مدیریت و کنترل سوکت‌ها نیز به همین شکل تمامی کامند‌های قبلی صادق بوده و فقط بجای service از socket استفاده میشود.

دریافت لیست سوکت‌ها با استفاده از systemctl

برای دریافت لیست سوکت‎های فعال و غیرفعال از دستور systemctl list-unit-files --type=socket استفاده می‌کنیم که خروجی همانند موارد قبل را مشاهده خواهید کرد.

چگونگی استاپ،استارت،ریلود و دریافت وضعیت یک سوکت با استفاده از systemctl

با استفاده از دستورات زیر میتوانید عملیات‌های ذکر شده را انجام دهید.

systemctl start cups.socket
systemctl restart cups.socket
systemctl stop cups.socket
systemctl reload cups.socket
systemctl status cups.socket

نحوه فعال یا غیر فعال کردن یک سوکت در زمان بوت سیستم(اوتو‎ استارت)

دستورات زیر همانند مورد مربوط به سرویس‎ها جهت اوتو استارت کردن سوکت‌ها نیز کارایی دارند is-active جهت بررسی وضعیت کنونی یک سوکت میباشد

systemctl is-active cups.socket
systemctl enable cups.socket
systemctl disable cups.socket

قرار دادن وضعیت سوکت در حالت غیر قابل استارت در لینوکس با systemctl

با استفاده ار دستور اول میتوانید یک سوکت در لینوکس را با استفاده از systemctl در وضعیت غیر‌قابل اجرا قرار دهید تا به صورت دستی یا درخواست سایر سرویس‌ها نیز اجرا نشود و با دستور دوم این وضعیت را لغو نمایید.

systemctl mask cups.socket
systemctl unmask cups.socket

این تمامی کامندهای مربوط به systemctl بود البته کامندهای دیگری هم هست که ما از آن‎ها به علت کارایی کم چشم پوشی کردیم، با ما همراه باشید و از طریق بخش نظرات، دیدگاه‌ها و کامندهای دیگر را در خصوص systemctl به اشتراک بگذارید.

ممکن است شما دوست داشته باشید
4 دیدگاه
  1. فرهنگ نگاری می گوید

    سلام و خسته نباشید میگم بهت
    دستتم درد نکنه.من به شخصه خیلی دلم میخواد بیشتر با این ابزارها کار کنم.
    چیزای مثل haproxy , fitoban , دستورات کامل فایروالها
    تنظیم میل سرور و ایجاد امنیت خوب با دانش کافی که هر بخش چیکار میکنه و هنگامی که خطا رخ میده کجا و چطوری میشه رفع کرد
    چطوری میشه dns ست کرد تو لینوکس و چطوری می چنرین وب سایت و سابدومین داشت.
    همه ایا هر بار که به مشکل میخورم با هزار زحمت رفع میکنم و حتی بیشتر این موارد میتونم بگم بلد نیستم و فقط کپی از مطالب خارجی و تمام که اصلا دوست ندارم.همیشه میخوام بدونم هر دستور چیکار میکنه و چیرو برام اماده میکنه
    خیلی ها از پنل های پولی یا رایگان استفاده میکنن.ولی اصلا نمیدونیم امنیت رعایت میشه یا همونی که طرف نموشته رو کور کوراه قبول میکنیم
    اگه اینچیزارو بتونی و وقتشو داشته باشی بنویسی یه لطف بزرگ به هم ادما فارسی زبان کردی
    بابت مطلبت ممنون

    1. مرتضی محمدی می گوید

      سلام
      ممنون از حسن توجه شما ، هدف من از ایجاد این سایت همین بوده اما متاسفانه کمبود زمان برای نوشتن مطالب باعث شده نتونم سایت رو آپدیت کنم که امیدوارم بزودی با مطالب جدید در خدمت شما دوستان عزیز باشم . نگران نباشید خیلی از حرفه ای ها هم خیلی مواقع از همین روش شما برای رفع مشکلات استفاده میکنند 🙂 و البته یکی از ارکان اصلی اوپن سورس هم همین موضوع در دسترس بودن مقالات و راه حل های رفع مشکلات به صورت رایگان برای همگان است که این سیستم رو جذاب تر میکنه ، در کل براتون آرزوی موفقیت دارم و امیدوارم روزی بتونید یک سیس ادمین موفق باشید .

  2. Sajad می گوید

    سلام
    از دستور chkconfig روی Centos 8 استفاده میکنم ولی این پیام دریافت میشه:

    Note: This output shows SysV services only and does not include native
    systemd services. SysV configuration data might be overridden by native
    systemd configuration.

    If you want to list systemd services use ‘systemctl list-unit-files’.
    To see services enabled on particular target use
    ‘systemctl list-dependencies [target]’.
    مشکل از چی هست؟

    1. مرتضی محمدی می گوید

      سلام
      از دستور systemctl استفاده کنید
      برخی از دستورات systemctl :
      systemctl list-unit-files –state=disabled
      systemctl enable httpd

ارسال یک پاسخ

آدرس ایمیل شما منتشر نخواهد شد.