淺談systemd原理和應用

語言: CN / TW / HK

多不說,直接上程式碼(可謂配置):

[Unit]
Description=demo app
After=network-is-online.target

[Service]
Type=Simple
ExecStart=/usr/bin/demo

[Install]
WantedBy=multi-user.target

:表達的意思是在network已經online情況下則啟動該服務,如果上述檔案為/lib/systemd/system/下的demo_app.service,則啟動。

tips:

cd /lib/systemd/system
systemctl is-enabled demo_app.service
systemctl enable demo_app.service

1. systemd崛起

聊聊linux系統的應用啟動服務的機制:

sysinit -> upstart -> systemd

systemd 主要是針對sysinit“發熱而生”,所謂熱則是/etc/init.d/xxx.sh,執行一連串的shell,以序列的機制無休止running指令碼,弊端頗多。

2. systemd基本過程

核心是通過套接字進行啟用通訊的,簡單點則是套接字trigger一切/下一個服務,不存在依賴關係。
套接字用socket,表示為------>:

A.  ------>B ------> D  
  \
   \
    ------>C ------> E
T1         T2       T3

Ts = T3 - T1
對比序列則
A - > B T2-T1 
A - > C T2-T1
B - > D T3-T2
C - > E T3-T2

Ti = 2(T3-T1) = 2 Ts

3. 應用更加廣泛,請看下eg

[Unit]
Description=demo app
After=network-on-line.target
Before=mysql-running.target


[Service]
Type=Simple
ExecStart=/usr/bin/demo

[Install]
WantedBy=multi-user.target

在network啟動後啟動demo,在mysql啟動前啟動demo,保證demo需要用到網路,但是不需要等mysql(啟動完3s)才開始該服務。(純屬假定場景)

至於.target怎麼形成,下文繼續分解。