多不说,直接上代码(可谓配置):

1
2
3
4
5
6
7
8
9
10
[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:

1
2
3
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基本过程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
核心是通过套接字进行激活通讯的,简单点则是套接字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

1
2
3
4
5
6
7
8
9
10
11
12
[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怎么形成,下文继续分解。