Systemd(Systemctl)系统管理服务脚本编写教程
简介
systemd作为系统启动方式,每一个服务以.service结尾,一般会分为3部分:Unit、Service和Install
Unit部分
服务的说明内容, 文档介绍以及对一些依赖服务定义
- Description 简单描述服务
- After 在什么服务启动之后
- Before 在什么服务启动之前启动
- Requires 依赖其他的单元服务, 需要与列出的服务一起激活,若任何服务无法启动,则该单元不会被激活
- Wants 比Requires依赖性弱,弱其他服务没有启动成功,该服务也不受影响,只是表示一种推荐
Service部分
服务的一些具体运行参数的设置
- Type
- simple:ExecStart字段启动的进程为主进程(默认)
- forking: ExecStart字段以fork方式启动,此时父进程将退出,子进程将成为主进程(后台运行),一般都设置为forking
- oneshot: 类似于simple,但只执行一次,systemd会等它执行完,才启动其他服务
- dbus:类似于simple, 但会等待D-Bus信号后启动
- notify: 类似于simple, 启动结束后会发出通知信号,然后systemd再启动其他服务
- idle:类似于simple,但是要等到其他任务都执行完,才会启动该服务
- EnvironmentFile:指定配置文件,和连词号(-)组合使用,,表示抑制错误,即发生错误时,不影响其他命令的执行。eg:
EnviromentFile=-/etc/sysconfig/xxx
表示即使文件不存在,也不会抛异常 - Environment: 后面接多个不同的shell变量。eg:Environment=DATA_DIR=/data/elk
- KillMode:
- control-group:当前控制组里的所有子进程,都会被杀掉(默认)
- process: 只杀主进程
- mixed: 主进程将收到SIGTERM信号,子进程收到SIGKILL信号
- none: 没有进程会被杀掉,只是执行服务的stop命令
- Restart的类型:
- no(默认值):退出后无操作
- on-success: 只有正常退出时(退出状态码为0),才会重启
- on-failure: 非正常退出时,重启,包括被信号终止和超时等,对于守护进程,推荐用on-failure
- on-abnormal:只有被信号终止或超时,才会重启
- on-abort:只有在收到没有捕捉到的信号终止时,才会重启
- on-watchdog: 超时退出时,才会重启
- always: 不管什么退出原因,都会重启
- WantedBy:
- multi-user.target: 表示多用户命令行状态,这个设置很重要,一般设置为multi-user.target
- graphical.target: 表示图形用户状体,它依赖于multi-user.target
- PIDFile:PID的文件路径
- PrivateTmp:是否分配独立的临时空间
- ExecStart:启动服务时执行的命令
- ExecReload:重启服务时执行的命令
- ExecStop:停止服务时执行的命令
- ExecStartPre:启动服务前执行的命令
- ExecStartPost:启动服务后执行的命令
- ExecStopPost:停止服务后执行的命令
- StartLimitInterval: 无限次重启,默认是10秒内如果重启超过5次则不再重启,设置为0表示不限次数重启
- RestartSec:表示systemd重启服务之前,需要等待的秒数:RestartSec: 30 ,默认值0.1(s)
注意:启动、重启、停止命令全部要求使用绝对路径,使用相对路径则会报错!服务保存位置
脚本的权限为754,脚本一般存放在/usr/lib/systemd中 , 目录下又有user和system之分 - /usr/lib/systemd/system :系统服务,开机不需要登录就能运行的程序(相当于开机自启)
- /usr/lib/systemd/user:用户服务,需要登录后才能运行的程序
systemctl命令用法
systemctl start [服务名(也是文件名)]
systemctl restart [服务名(也是文件名)]
systemctl stop [服务名(也是文件名)]
systemctl status [服务名(也是文件名)]
systemctl enable [服务名(也是文件名)]
systemctl disable [服务名(也是文件名)]举例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41[Unit]
Description=Docker Application Container Engine
Documentation=http://docs.docker.com
After=network.target
Wants=docker-storage-setup.service
Requires=docker-cleanup.timer
[Service]
Type=notify
NotifyAccess=main
EnvironmentFile=-/run/containers/registries.conf
EnvironmentFile=-/etc/sysconfig/docker
EnvironmentFile=-/etc/sysconfig/docker-storage
EnvironmentFile=-/etc/sysconfig/docker-network
Environment=GOTRACEBACK=crash
Environment=DOCKER_HTTP_HOST_COMPAT=1
Environment=PATH=/usr/libexec/docker:/usr/bin:/usr/sbin
ExecStart=/usr/bin/dockerd-current \
--add-runtime docker-runc=/usr/libexec/docker/docker-runc-current \
--default-runtime=docker-runc \
--exec-opt native.cgroupdriver=systemd \
--userland-proxy-path=/usr/libexec/docker/docker-proxy-current \
--init-path=/usr/libexec/docker/docker-init-current \
--seccomp-profile=/etc/docker/seccomp.json \
$OPTIONS \
$DOCKER_STORAGE_OPTIONS \
$DOCKER_NETWORK_OPTIONS \
$ADD_REGISTRY \
$BLOCK_REGISTRY \
$INSECURE_REGISTRY \
$REGISTRIES
ExecReload=/bin/kill -s HUP $MAINPID
LimitNOFILE=1048576
LimitNPROC=1048576
LimitCORE=infinity
TimeoutStartSec=0
Restart=on-abnormal
KillMode=process
[Install]
WantedBy=multi-user.target相关文档
https://www.ibm.com/developerworks/cn/linux/1407_liuming_init3/index.html
https://wizardforcel.gitbooks.io/vbird-linux-basic-4e/content/150.html