轻聆月下
轻聆月下
发布于 2024-03-24 / 8 阅读
0
0

systemd 服务配置

一、配置文件

介绍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 的配置文件分三部分:

  1. [unit] 部分
  2. [Service] 部分
  3. [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 命令进行操作了。

  1. systemctl daemon-reload 更新配置文件后,重新加载配置
  2. systemctl restart xxxxx.service 重启指定服务。即执行[Service]部分设置的重启命令
  3. systemctl enable xxxxx.service 设置指定服务开机启动。即根据 [Install]部分的设置,在操作系统启动时启动指定服务
  4. systemctl stop xxxxx.service 停止指定服务。即执行[Service]部分设置的停止相关命令
  5. journalctl -u xxxxx.service -f 查看指定服务的日志。

评论