2015年9月9日 星期三

速記:Linux下的常駐服務管理(Sys-V vs. Systemd)


Debian決定之後, 看來未來init system的選項已經沒什麼爭議, 除了準備了解systemd之外, 也備忘早年各distro用來管理sys-v服務的工具。

Systemd:

---
systemd以一支systemctl進行服務的設定,
原本/etc/init.d/裡的daemon現在的位置在/lib/systemd/下,具體位置各家可能有所調整,但是管理工具的用法都相同。

啟動:systemctl start foobar.service
停止:systemctl stop foobar.service
重新啟動:systemctl restart foobar.service
重讀設定:systemctl reload foobar.service
顯示狀態:systemctl status foobar.service
列出全部:systemctl list-unit-files --type=service 或 ls /etc/systemd/system/*.wants/
列出全部開機自行啟動的服務:systemctl list-unit-files|grep enabled
設定開機啟動:systemctl enable foobar.service
設定開機不啟動:systemctl disable foobar.service
查詢是否被設為開機啟動:systemctl is-enabled foobar.service

原本的runlevel機制由target取代:

telinit 3 --> systemctl isolate multi-user.target 或 systemctl isolate runlevel3.target
init 5 --> systemctl isolate graphical.target 或 systemctl isolate runlevel5.target

設定開機自動進入的runlevel:

在systemd中不使用/etc/inittab, default runlevel是由soft link實現,

例如default runlevel 3:
ln -s /lib/systemd/system/multi-user.target /etc/systemd/system/default.target

但是由於default.target的位置每家不太一樣, 比較合適的作法是:
systemctl set-default -f multi-user.target


Sys-V:

列出全部: ls /etc/init.d/
啟動: /etc/init.d/{SERVICENAME} start
停止: /etc/init.d/{SERVICENAME} stop
設為開機自動啟動: cd /etc/rc3.d; ln -s ../init.d/{SERVICENAME} S95{SERVICENAME}
移除開機自動啟動: rm /etc/rc3.d/*{SERVICENAME}
切換runlevel: telinit 3
設定default runlevel: sed s/^id:.*:initdefault:/id:3:initdefault:/

除此之外各大Distro於Sys-V時期也有各自的管理工具:

Redhat(service/chkconfig):

啟動:service {SERVICENAME} start
停止:service {SERVICENAME} stop
重新啟動:service {SERVICENAME} restart
重讀設定:service {SERVICENAME} reload
顯示狀態:service {SERVICENAME} status
列出全部:chkconfig --list
設定開機啟動:chkconfig {SERVICENAME} on
設定開機不啟動:chkconfig {SERVICENAME} off
查詢是否被設為開機啟動:chkconfig {SERVICENAME}

Debian(update-rc.d/invoke-rc.d):

啟動:invoke-rc.d {SERVICENAME} start
停止:invoke-rc.d {SERVICENAME} stop
重新啟動:service {SERVICENAME} restart
重讀設定:service {SERVICENAME} reload
顯示狀態:service {SERVICENAME} status
列出全部:rcconf
設為開機自動啟動: update-rc.d {SERVICENAME} default
移除開機自動啟動: update-rc.d -f {SERVICENAME} remove
設定啟動與關閉的runlevel:
update-rc.d {SERVICENAME} start [order] [runlevel]
update-rc.d {SERVICENAME} stop [order][runlevel]
例如 update-rc.d {SERVICENAME} start 20 0 1 2 6
表示SERVICENAME在runlevel 0, 1, 2, 6以編號20的次序啟動

Ubuntu(upstart): 

列出全部:initctl list
啟動:initctl start {SERVICENAME}
停止:initctl stop {SERVICENAME}
設為開機自動啟動:
 1. /etc/default/{SERVICENAME}, 將ENABLED=...改為ENABLED=1
 2. /etc/init/{SERVICENAME}.override, 要嘛沒這檔案, 不然裏面必須包含start字樣, 不是manual
移除開機自動啟動: echo manual > /etc/init/{SERVICENAME}.override

參考:

http://fedoraproject.org/wiki/SysVinit_to_Systemd_Cheatsheet