จัดการเซอร์วิสด้วย systemd ใน CentOS 7

สิ่งหนึ่งที่เปลี่ยนไปใน CentOS 7 หรือ Red Hat Enterprise 7 คือเปลี่ยนมาใช้ systemd ในการบริหารจัดการโปรเซสและอีกหลายสิ่งบนลีนุกซ์ แทนที่การใช้ init หรือ upstart ในเวอร์ชั่นก่อน

ผลที่เห็นอย่างชัดเจนคือทำให้เครื่องบู๊ตได้เร็วมากขึ้น เพราะ systemd จะจัดการให้แต่ละโปรเซสหรือเซอร์วิสสตาร์ตได้พร้อมๆ กัน แทนที่จะรันทีละโปรเซส

แม้จะมีคนไม่เห็นด้วยกันหลายคนถึงความซับซ้อนในตัวระบบ systemd เอง แต่ก็เริ่มมีลีนุกซ์หลายดิสทริบิวชั่น (Linux Distribution) เปลี่ยนมาใช้ systemd กันบ้างแล้ว โดยเริ่มจาก Fedora ตั้งแต่เวอร์ชั่น 15, RedHat Enterprise 7, CentOS 7 และล่าสุด ณ ตอนที่เขียนบทความนี้ (11 ตุลาคม 2557) Ubuntu 14.10 ก็มีข่าวว่าจะรองรับ systemd ด้วย แต่ยังไม่แน่ว่าจะเป็นดีฟอลต์ตอนบู๊ตหรือไม่

ในที่นี้ลองมาดูการเปลี่ยนแปลงคร่าวๆ กัน

ใช้คำสั่ง ps -ef เพื่อดูโปรเซส สังเกตว่าโปรเซสแรก PID=1 จะรันโดย systemd แทนที่จะเป็น init

[root@cent7 ~]# ps -ef
UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0 20:46 ?        00:00:01 /usr/lib/systemd/systemd --switched-root --system --deserialize 23
root         2     0  0 20:46 ?        00:00:00 [kthreadd]
root         3     2  0 20:46 ?        00:00:00 [ksoftirqd/0]
root         5     2  0 20:46 ?        00:00:00 [kworker/0:0H]
...

หรือถ้าดูไฟล์คอนฟิก /etc/inittab ก็จะเห็นว่าไม่ได้ใช้ไฟล์นี้แล้ว พร้อมคำอธิบายเพิ่มเติม

[root@cent7~]# cat /etc/inittab
# inittab is no longer used when using systemd.
#
# ADDING CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR SYSTEM.
#
# Ctrl-Alt-Delete is handled by /etc/systemd/system/ctrl-alt-del.target
#
# systemd uses 'targets' instead of runlevels. By default, there are two main targets:
#
# multi-user.target: analogous to runlevel 3
# graphical.target: analogous to runlevel 5
#
# To set a default target, run:
#
# ln -sf /lib/systemd/system/<target name>.target /etc/systemd/system/default.target
#

เพื่อความเข้าใจง่าย จะติดตั้ง Apache (httpd) สำหรับการทดสอบการรันเซอร์วิส

[root@cent7 ~]# yum install httpd

จริงๆ แล้ว การจัดการหรือการคอนฟิก systemd ต้องใช้คำสั่ง systemctl  แต่สำหรับผู้ที่ยังไม่คุ้นเคย  เราสามารถใช้คำสั่ง service หรือ chkconfig ได้เหมือนที่เคยใช้ในเวอร์ชั่นเก่าได้ จะสามารถจัดการหรือคอนฟิกเซอร์วิสได้ แต่ผลจะมีการแสดงตัวอย่างการใช้ systemctl พร้อมออปชั่นที่ให้ผลลัพธ์ที่เหมือนกันการรันที่เหมือนกัน

ตัวอย่างการใช้คำสั่ง service เพื่อรัน (start) เซอร์วิส httpd

[root@cent7 ~]# service httpd start
Redirecting to /bin/systemctl start  httpd.service

ใช้คำสั่ง ps เพื่อดูโปรเซส  httpd ที่รัน

[root@cent7 ~]# ps -ef | grep httpd
root      3179     1  0 22:12 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache    3180  3179  0 22:12 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache    3181  3179  0 22:12 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache    3182  3179  0 22:12 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache    3183  3179  0 22:12 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache    3184  3179  0 22:12 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND

ดูสถานะของเซอร์วิส httpd

[root@cent7 ~]# service httpd status
Redirecting to /bin/systemctl status  httpd.service
httpd.service - The Apache HTTP Server
   Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled)
   Active: active (running) since Sat 2014-10-11 22:12:42 ICT; 17s ago
  Process: 3163 ExecStop=/bin/kill -WINCH ${MAINPID} (code=exited, status=0/SUCCESS)
 Main PID: 3179 (httpd)
   Status: "Total requests: 0; Current requests/sec: 0; Current traffic:   0 B/sec"
   CGroup: /system.slice/httpd.service
           ├─3179 /usr/sbin/httpd -DFOREGROUND
           ├─3180 /usr/sbin/httpd -DFOREGROUND
           ├─3181 /usr/sbin/httpd -DFOREGROUND
           ├─3182 /usr/sbin/httpd -DFOREGROUND
           ├─3183 /usr/sbin/httpd -DFOREGROUND
           └─3184 /usr/sbin/httpd -DFOREGROUND
Oct 11 22:12:42 cent7 systemd[1]: Starting The Apache HTTP Server...
Oct 11 22:12:42 cent7 systemd[1]: Started The Apache HTTP Server.

ตัวอย่างการใช้คำสั่ง service เพื่อหยุดการรัน (stop) เซอร์วิส httpd

[root@cent7 ~]# service httpd stop
Redirecting to /bin/systemctl stop  httpd.service
[root@cent7 ~]# service httpd status
Redirecting to /bin/systemctl status  httpd.service
httpd.service - The Apache HTTP Server
Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled)
Active: inactive (dead) since Sat 2014-10-11 22:13:21 ICT; 1s ago
Process: 3210 ExecStop=/bin/kill -WINCH ${MAINPID} (code=exited, status=0/SUCCESS)
Process: 3179 ExecStart=/usr/sbin/httpd $OPTIONS -DFOREGROUND (code=exited, status=0/SUCCESS)
Main PID: 3179 (code=exited, status=0/SUCCESS)
Status: "Total requests: 0; Current requests/sec: 0; Current traffic:   0 B/sec"
Oct 11 22:12:42 cent7 systemd[1]: Starting The Apache HTTP Server...
Oct 11 22:12:42 cent7 systemd[1]: Started The Apache HTTP Server.
Oct 11 22:13:20 cent7 systemd[1]: Stopping The Apache HTTP Server...
Oct 11 22:13:21 cent7 systemd[1]: Stopped The Apache HTTP Server.

ตัวอย่างการใช้ systemctl ในการรัน และหยุดการรันเซอร์วิส httpd

[root@cent7 ~]# systemctl start httpd.service
[root@cent7 ~]# ps -ef | grep httpd
root      3228     1  0 22:13 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache    3229  3228  0 22:13 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache    3230  3228  0 22:13 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache    3231  3228  0 22:13 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache    3232  3228  0 22:13 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache    3233  3228  0 22:13 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
[root@cent7 ~]# systemctl stop httpd.service
[root@cent7 ~]# ps -ef | grep httpd
[root@cent7 ~]#

ตัวอย่างการคอนฟิกให้สตาร์ตเซอร์วิส httpd ด้วยตอนบู๊ตเครื่อง

[root@cent7 ~]# chkconfig httpd on
Note: Forwarding request to 'systemctl enable httpd.service'.
ln -s '/usr/lib/systemd/system/httpd.service' '/etc/systemd/system/multi-user.target.wants/httpd.service'

ไฟล์ที่ใช้ในการสตาร์ตแต่ละเซอร์วิส ซึ่งแต่เดิมส่วนใหญ่จะเป็น shell script แต่ใน systemd จะใช้เป็นไฟล์คอนฟิกแทน ทำให้เซอร์วิสที่ต้องการใช้ systemd ด้วย ต้องเปลี่ยนไฟล์สตาร์ตใหม่

ตัวอย่างไฟล์คอนฟิก systemd ที่ใช้ในการรันเซอร์วิส httpd

[root@cent7 ~]# cat /etc/systemd/system/multi-user.target.wants/httpd.service
[Unit]
Description=The Apache HTTP Server
After=network.target remote-fs.target nss-lookup.target
[Service]
Type=notify
EnvironmentFile=/etc/sysconfig/httpd
ExecStart=/usr/sbin/httpd $OPTIONS -DFOREGROUND
ExecReload=/usr/sbin/httpd $OPTIONS -k graceful
ExecStop=/bin/kill -WINCH ${MAINPID}
# We want systemd to give httpd some time to finish gracefully, but still want
# it to kill httpd after TimeoutStopSec if something went wrong during the
# graceful stop. Normally, Systemd sends SIGTERM signal right after the
# ExecStop, which would kill httpd. We are sending useless SIGCONT here to give
# httpd time to finish.
KillSignal=SIGCONT
PrivateTmp=true
[Install]
WantedBy=multi-user.target

ดูเซอร์วิสและโปรเซสที่จะรันตอนบู๊ตเครื่อง (enabled)

[root@cent7 ~]# systemctl list-unit-files | grep enabled
auditd.service                              enabled
avahi-daemon.service                        enabled
crond.service                               enabled
dbus-org.fedoraproject.FirewallD1.service   enabled
dbus-org.freedesktop.Avahi.service          enabled
dbus-org.freedesktop.NetworkManager.service enabled
dbus-org.freedesktop.nm-dispatcher.service  enabled
firewalld.service                           enabled
getty@.service                              enabled
httpd.service                               enabled
irqbalance.service                          enabled
kdump.service                               enabled
lvm2-monitor.service                        enabled
microcode.service                           enabled
NetworkManager-dispatcher.service           enabled
NetworkManager.service                      enabled
postfix.service                             enabled
rsyslog.service                             enabled
sshd.service                                enabled
systemd-readahead-collect.service           enabled
systemd-readahead-drop.service              enabled
systemd-readahead-replay.service            enabled
tuned.service                               enabled
avahi-daemon.socket                         enabled
dm-event.socket                             enabled
lvm2-lvmetad.socket                         enabled
default.target                              enabled
multi-user.target                           enabled
remote-fs.target                            enabled

 

ข้อมูลอ้างอิง

 

Leave a Reply

Your email address will not be published.