一、配置文件
介绍systemd的服务配置文件。
1.1 配置文件位置
一般情况下,被systemd管理的服务配置文件存放在 /usr/lib/systemd/system/
目录下,命名为 xxxx.service
。
1.2 配置文件内容
一个简单的示例:
[Unit]
Description=xxxxxx-Client
After=network.target
[Service]
ExecStart=/usr/bin/python3 /usr/local/bin/xxxx.py arg1 arg2
ExecReload=/bin/kill -HUP $MAINPID
Restart=on-failure
[Install]
WantedBy=multi-user.target
如上所见,一个 service 的配置文件分三部分:
- [unit] 部分
- [Service] 部分
- [Install] 部分
1.2.1 [Unit] 部分
[Unit] 部分,描述这个服务,并且可以用于确定服务的启动顺序和依赖关系。
[Unit]
Description=服务的描述
Documentation=服务的文档位置
After=network.target sshd-keygen.service
Before=xxxxx.service
Wants=sshd-keygen.service
Requires=yyyyy.service
Description是用于描述当前服务的字段,可以填写关于当前服务的易于理解的简短描述。
关于启动顺序,由After和Before两个字段控制。表示当前服务应在哪些服务启动之后,在哪些服务启动之前。空格分隔多个服务。
比如,当前服务依赖网络才能启动,则添加 After=network.target
。
关于依赖关系,由Wants和Requires两个字段控制。Wants表示一种弱依赖关系,即Wants设置的服务,终止或者启动失败,不影响当前服务。而Requires是强依赖关系,即其设置的服务终止或者退出,当前服务也应该终止。
1.2.2 [Service] 部分
[Service] 部分设置了当前服务的启动行为以及重启的动作。
1.2.2.1 启动参数
[Service]
ExecStart=/bin/echo execstart1
ExecStart=/bin/echo execstart2
ExecStartPost=/bin/echo post1
ExecStartPost=/bin/echo post2
其常用参数有:
ExecStart
字段:定义启动进程时执行的命令ExecReload
字段:重启服务时执行的命令ExecStop
字段:停止服务时执行的命令ExecStartPre
字段:启动服务之前执行的命令ExecStartPost
字段:启动服务之后执行的命令ExecStopPost
字段:停止服务之后执行的命令Type
字段:定义服务的启动类型RemainAfterExit
字段:取值yes时,ExecStart设置的进程退出后,服务不会停止。可以用于设置那种启动和停止执行不同脚本的服务。
Type字段可以设置的值如下(一般用默认的就行):
- simple(默认值):
ExecStart
字段启动的进程为主进程 - forking:
ExecStart
字段将以fork()
方式启动,此时父进程将会退出,子进程将成为主进程 - oneshot:类似于
simple
,但只执行一次,Systemd 会等它执行完,才启动其他服务 - dbus:类似于
simple
,但会等待 D-Bus 信号后启动 - notify:类似于
simple
,启动结束后会发出通知信号,然后 Systemd 再启动其他服务 - idle:类似于
simple
,但是要等到其他任务都执行完,才会启动该服务。一种使用场合是为让该服务的输出,不与其他服务的输出相混合
1.2.2.2 重启参数
[Service]
ExecStart=/bin/echo execstart1
KillMode=control-group
Restart=on-failure
RestartSec=10
KillMode
字段可以设置的值如下(一般直接用默认值就行):
- control-group(默认值):当前控制组里面的所有子进程,都会被杀掉
- process:只杀主进程
- mixed:主进程将收到 SIGTERM 信号,子进程收到 SIGKILL 信号
- none:没有进程会被杀掉,只是执行服务的 stop 命令。
Restart
字段可以设置的值如下:
- no(默认值):退出后不会重启
- on-success:只有正常退出时(退出状态码为0),才会重启
- on-failure:非正常退出时(退出状态码非0),包括被信号终止和超时,才会重启
- on-abnormal:只有被信号终止和超时,才会重启
- on-abort:只有在收到没有捕捉到的信号终止时,才会重启
- on-watchdog:超时退出,才会重启
- always:不管是什么退出原因,总是重启
建议使用 on-failure
或者莽一点,使用 always
。
RestartSec
字段表示重启之前等待的时间,单位是秒。
1.2.3 [Install] 部分
[Install]
WantedBy=multi-user.target
[Install] 部分定义了当前服务如何安装,即应该在哪些情况下自动启动。
使用 WantedBy
字段,设置该服务所在的 Target。Target是服务组,表示一组服务
一般直接设置为多用户命令行状态,即 multi-user.target
。也可以设置为图形用户状态graphical.target
。
各种系统内置了相当多的Target,可以参考 bootup (www.freedesktop.org)
二、systemctl命令
已经写好的配置文件,放在 /usr/lib/systemd/system/
目录之后,就可以通过 systemctl
命令进行操作了。
systemctl daemon-reload
更新配置文件后,重新加载配置systemctl restart xxxxx.service
重启指定服务。即执行[Service]部分设置的重启命令systemctl enable xxxxx.service
设置指定服务开机启动。即根据 [Install]部分的设置,在操作系统启动时启动指定服务systemctl stop xxxxx.service
停止指定服务。即执行[Service]部分设置的停止相关命令journalctl -u xxxxx.service -f
查看指定服务的日志。