0x01 什麼是Systemd Service
- Systemd 服務是一種以 .service 結尾的單元(unit)配置文件,用於控制由Systemd 控制或監視的進程。簡單說,用於後臺以守護精靈(daemon)的形式運行程序。
- Systemd 普遍應用於新版本的RHEL、SUSE Linux Enterprise、CentOS、Fedora和openSUSE中,用於替代舊有的服務管理器
service
。
- 基本命令:
systemctl command xxx.service
# 其中command能夠是start、stop、restart、enable等,好比:
systemctl start httpd.service #啓動Apache服務
systemctl stop httpd.service #中止Apache服務
systemctl restart httpd.service #中止Apache服務
systemctl enable mariadb.service #將MariaDB服務設爲開機啓動
0x02 Systemd Service 存放的位置
- Systemd Service 位於
/etc/systemd/system
(供系統管理員和用戶使用),/usr/lib/systemd/system
(供發行版打包者使用),咱們通常使用前者便可。
0x03 編寫Systemd Service
- Systemd 服務的內容主要分爲三個部分,控制單元(unit)的定義、服務(service)的定義、以及安裝部分。
1. 定義控制單元 [Unit]
- 在 Systemd 中,全部引導過程當中 Systemd 要控制的東西都是一個單元。基本的用法以下:
- Description:表明整個單元的描述,可根據須要任意填寫。
- Wants:本單元啓動了,它「想要」的單元也會被啓動。可是這個單元若啓動不成功,對本單元沒有影響。
- Requires: 這個單元啓動了,那麼它「須要」的單元也會被啓動; 它「須要」的單元被中止了,它本身也活不了。可是請注意,這個設定並不能控制啓動順序,由於它「須要」的單元啓動也須要時間,若它「須要」的單元啓動還未完成,就開始啓動本單元,則本單元也沒法啓動,因此不建議使用這個字段。
- OnFailure:若本單元啓動失敗了,那麼啓動這個單元做爲折衷。
- Before/After:指定啓動順序。
- 看一個實際的例子:
[Unit]
Description=Protect ARP list
Wants=network-online.target
After=network.target
- 其中network.target表明有網路,network-online.target表明一個連通着的網絡。
2. 定義服務本體 [service]
- 在定義完了 Systemd 用來識別服務的單元后,咱們來定義服務本體。基本的用法以下:
-
Type:服務的類型,各類類型的區別以下所示網絡
- simple:默認,這是最簡單的服務類型。意思就是說啓動的程序就是主體程序,這個程序要是退出那麼一切皆休。
- forking:標準 Unix Daemon 使用的啓動方式。啓動程序後會調用 fork() 函數,把必要的通訊頻道都設置好以後父進程退出,留下守護精靈的子進程。
- oneshot:適用於那些被一次性執行的任務或者命令,它運行完成後便了無痕跡。由於這類服務運行完就沒有任何痕跡,咱們常常會須要使用 RemainAfterExit=yes。意思是說,即便沒有進程存在,Systemd 也認爲該服務啓動成功了。同時只有這種類型支持多條命令,命令之間用
;
分割,如需換行能夠用\
。
- dbus:這個程序啓動時須要獲取一塊 DBus 空間,因此須要和 BusName= 一塊兒用。只有它成功得到了 DBus 空間,依賴它的程序纔會被啓動。
- ExecStart:在輸入的命令是start時候執行的命令,這裏的命令啓動的程序必須使用絕對路徑,好比你必須用
/sbin/arp
而不能簡單的以環境變量直接使用arp
。
- ExecStop:在輸入的命令是stop時候執行的命令,要求同上。
- ExecReload:這個不是必需,若是不寫則你的service就不支持restart命令。ExecStart和ExecStop是必需要有的。
- 看一個實際的例子:
[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/sbin/arp -f /etc/ip-mac
ExecReload=/sbin/arp -f /etc/ip-mac
ExecStop=/sbin/arp -d -a
- 這裏在start和restart的時候會讀取並添加
/etc/ip-mac
文件中的ARP條目到ARP表中,而stop時清空ARP表。
3. 安裝服務 [install]
- 服務編寫完以後還須要被systemd裝載,定義安裝單元各個字段以下:
- WantedBy:設置服務被誰裝載,通常設置爲
multi-user.target
- Alias:爲service設置一個別名,可使用多個名字來操做服務。
- Also:在安裝這個服務時候還須要的其餘服務
4.完整的 Systemd Service 配置實例
- 組合上面的三個模塊,咱們能夠獲得一個完整的 Systemd Service 配置實例:
[Unit]
Description=Protect ARP list
Wants=network-online.target
After=network.target
[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/sbin/arp -f /etc/ip-mac
ExecReload=/sbin/arp -f /etc/ip-mac
ExecStop=/sbin/arp -d -a
[Install]
WantedBy=multi-user.target
0x04 總結
- Systemd Service 是一種替代
/etc/init.d/
下腳本的更好方式,它能夠靈活的控制你何時要啓動服務,通常狀況下也不會形成系統沒法啓動進入緊急模式。因此若是想設置一些開機啓動的東西,能夠試着寫 Systemd Service。固然了,前提是你使用的Linux發行版是支持它的才行。
參考資料:
openSUSE:How to write a systemd service