在/usr/lib/systemd目录下包含了各种unit文件,有service后缀的服务unit,有target后缀的开机级别unit等,这里介绍关于service后缀的文件。因为systemd在开机要想执行自启动,都是通过这些*.service 的unit控制的,
服务又分为系统服务(system)和用户服务(user)。
系统服务:开机不登陆就能运行的程序(常用于开机自启)在/usr/lib/systemd/system目录下
用户服务:需要登陆以后才能运行的程序。
查看配置文件
systemctl cat nginx.service
配置文件详解
[Unit]
After | 表示服务需要在***服务之后执行 |
Before | 表示服务需要在***服务之前执行 |
Wants | 弱依赖关系 |
Requires | 强依赖关系 ***服务停止之后本服务也必须停止 |
[Service]
EnvironmentFile | 环境参数 |
ExecStart | 程序进程执行时的命令 |
ExecReload | 重启服务时执行的命令 |
ExecStop | 停止服务时执行的命令 |
ExecStartPre | 启动服务之前执行的命令 |
ExecStartPost | 启动服务之后执行的命令 |
ExecStopPost | 停止服务之后执行的命令 |
所有的启动设置之前,都可以加上一个连词号(-),表示"抑制错误",即发生错误的时候,不影响其他命令的执行。比如,EnvironmentFile=-/etc/sysconfig/sshd(注意等号后面的那个连词号),就表示即使/etc/sysconfig/sshd文件不存在,也不会抛出错误
Type段
simple(默认) | ExecStart字段启动的进程为主进程 |
forking | ExecStart以fork()方式进行启动,此时父进程将会推出,子进程将成为主进程 |
oneshot | 类似于simple,但只执行一次,Systemd会等它执行完,才启动其他服务 |
dbus | 类似于simple,但会等待D-Bus信号后启动 |
notify | 类似于simple,启动结束后会发出通知信号,然后Systemd再启动其他服务 |
dle | 类似于simple,但是要等到其他任务都执行完,才会启动该服务。 |
KillMode字段
control-group(默认) | 当前控制组里面的所有子进程,都会被杀掉 |
porcess | 只杀主进程 |
mixed | 主进程将收到 SIGTERM 信号,子进程收到 SIGKILL 信号 |
none | 没有进程会被杀掉,只是执行服务的 stop 命令 |
Restart字段
no(默认值) | 退出后不会重启 |
on-success | 只有正常退出时(退出状态码为0),才会重启 |
on-failure | 非正常退出时(退出状态码非0),包括被信号终止和超时,才会重启 |
on-abnormal | 只有被信号终止和超时,才会重启 |
on-abort | 只有在收到没有捕捉到的信号终止时,才会重启 |
on-watchdog | 超时退出才会重启 |
[Install]
Install区块,定义如何安装这个配置文件,即怎样做到开机启动。
WantedBy字段:表示该服务所在的 Target。
常用的 Target 有两个:
multi-user.target:表示多用户命令行状态
graphical.target:表示图形用户状态
示例 docker.service
[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