前言
依Linux系統慣例,帶字母d
的一般爲守護進程(daemon),Systemd即爲System Daemon,是Linux下的一款系統和服務管理器,用於取代傳統的Init組件。
Systemd功能強大,諸如Gnome桌面、用戶登錄管理、網絡服務都已集成其中,甚至後續udev也要加入Systemd的"豪華套餐"。不過開源社區對於Systemd則是充滿了爭議:有人認爲它有利於Linux系統標準化;有人則認爲它管的太多——不符合UNIX
“keep simple, keep stupid"的設計哲學,總之是有褒有貶。而現在,越來越多的Linux發行版(如SUSE、RedHat、CentOS、Ububtu等)都開始使用Systemd,大勢所趨,Systemd在爭議之中竟有一統Linux發行版之勢。
作爲一個開發爲主,順便學學運維的小蝦米,我接觸Systemd的目的是爲了實現一個腳本開機自啓動的功能,至於其他的"是是非非”,自有肉食者謀,這裏便不過多評價。
單元、服務與配置文件
Systemd由許多單元(Unit)組成,例如我們熟悉的SSH、Samba、Firewall等服務(Service),都由與之相關的Systemd單元進行管理。
Systemd單元有許多類型,不僅有管理服務的單元,還有管理其他系統資源的單元(如socket、系統設備、掛載點、文件系統等)。
要了解一個單元,最直觀的方式就是查看它的配置文件,以SSH爲例,在Systemd中由單元sshd.service管理,執行以下命令可以查看配置文件內容:
$ systemctl cat sshd.service
SSH配置文件:
[Unit]
Description=OpenSSH server daemon
Documentation=man:sshd(8) man:sshd_config(5)
After=network.target sshd-keygen.service
Wants=sshd-keygen.service
[Service]
EnvironmentFile=/etc/sysconfig/sshd
ExecStart=/usr/sbin/sshd -D $OPTIONS
ExecReload=/bin/kill -HUP $MAINPID
Type=simple
KillMode=process
Restart=on-failure
RestartSec=42s
[Install]
WantedBy=multi-user.target
可以看到,配置文件分成幾個區塊,每個區塊包含若干條字段組成的鍵值對,下面對解上述配置文件中幾個關鍵字段的含義進行解釋:
- Description
當前服務的簡單描述 - After
啓動順序(與之對應還有Before),表示sshd.service在network.target與sshd-keygen.service之後啓動 - ExecStart
啓動命令,定義服務啓動時執行的命令 - ExecReload
重載命令,定義服務重載時執行的命令 - Type
啓動類型,下表列出了幾種常見的類型
值 | 描述 |
---|---|
simple | 默認值, 表示啓動的服務爲主進程 |
oneshot | 類似於simple,只執行一次,Systemd等待執行完畢後才啓動其他服務 |
forking | 以fork()方式啓動,父進程退出,子進程成爲主進程 |
- WantedBy
表示服務所在的Target
Target也是一種Systemd單元,可以理解爲服務組,即一系列服務的集合
實現一個開機自啓動服務
初步瞭解單元與配置文件後,我們就可以通過Systemd實現一個開機自啓動的服務了。例如現有一個程序MyProgram
位於目錄/home
下,欲使其開機自啓動,步驟如下:
1. 新增自定義服務
在/usr/lib/systemd目錄下新增配置文件MyProgram.service
,如下:
[Unit]
Description=my program
[Service]
Type=oneshot
ExecStart=/home/MyProgram
[Install]
WantedBy=multi-user.target
2. 使能新增的服務
執行如下命令:
$ systemctl enable MyProgram.service
根據配置文件中字段WantedBy的值,該命令將在目錄/etc/systemd/system/multi-user.target
下創建文件MyProgram.service
的軟鏈接。
3. 查看運行狀態
如此操作後,系統將在啓動後執行程序MyProgram,執行如下命令查看服務的運行狀態
$ systemctl status MyProgram.service
4. 去使能新增的服務
如果想取消開機啓動MyProgram,則需執行以下命令:
$ systemctl disable MyProgram.service