Akemi

systemd Unit及其配置文件

2025/03/22

target

target就是一堆Service的集合,它本身不是service,但是他关联了很多service

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
众所周知,系统运行等级3是多租户模式
systemctl get-default
multi-user.target

systemctl list-dependencies multi-user.target
multi-user.target
● ├─aegis.service
● ├─aliyun.service
....
● ├─var-lib-snapd-snap-snapd-23771.mount
● ├─basic.target
● │ ├─microcode.service

从这个图中可以看出,它除了依赖service,还依赖basic.target

除此之外,系统会加载/etc/systemd/system/multi-user.target.wants
这个目录下都是一些软链接
是multi-user.target它希望运行的一些service

Service配置文件解析

以sshd服务为例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
cat /usr/lib/systemd/system/sshd.service
[Unit]
Description=OpenSSH server daemon
Documentation=man:sshd(8) man:sshd_config(5)
After=network.target sshd-keygen.service
Wants=sshd-keygen.service

[Service]
Type=notify
EnvironmentFile=/etc/sysconfig/sshd
ExecStart=/usr/sbin/sshd -D $OPTIONS
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure
RestartSec=42s

[Install]
WantedBy=multi-user.target

[Unit]部分——定义Unit的元数据

1
2
3
4
5
6
7
8
9
10
Description: 描述
Documentation: 文档地址
Requires: (硬性)依赖关系——当前Unit依赖的其他Unit
Wants: (软性)配合关系——当前Unit配合的其他Unit
BindsTo: 共生关系——如果指定Unit退出,当前Unit也会退出
Before: 顺序关系——指定的Unit必须在当前Unit启动后启动
After: 顺序关系——指定的Unit必须在当前Unit启动前启动
Conflicts: 冲突关系——不能和当前Unit同时运行
Condition: 条件关系——当前Unit运行需要满足的条件
Assert: 条件关系——当前Unit运行需要满足的条件

[Service]部分——表示Unit的配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Type: 定义Service启动时的进程行为(
其选项包括:
Type-simple: 默认值,执行ExecStart命令,启动主进程
Type-forking: 从父进程创建子进程,创建后父进程会退出,需要指定PIDFile。如mysql,redis,httpd
Type-notify: 当服务启动完毕,通知systemd继续往下执行——作为系统启动流程的一部分
Type-oneshot: 一次性进程,Systemd会等待服务退出再继续执行
Type-dbus: 通过D-bus启动
Type-idle: 其他任务执行完毕时,当前服务才会运行
)

ExecStart: 启动服务的命令
ExecStartPre: 启动服务之前运行的命令
ExecStartPost: 启动服务之后运行的命令
ExecReload: 重启服务时执行的命令(kill -hup)
ExecStop: 服务停止时执行的命令
ExecStopPost: 停止服务后执行的命令
Restart: 自动重启的策略:(
always 总是重启
on-success 只有成功了才自动重启
on-failure 只有失败了才自动重启
等)
RestartSec: 自动重启时,间隔的秒数
TimeoutSec: 停止服务前等待的秒数
Environment: 定义变量

[Install]部分——定义如何启动服务

1
2
3
4
WantedBy: 和target联系起来,会将当前Unit放入到目标target的wants目录中,使其开机自启
RequiredBy: 和target联系起来,会将当前Unit放入到目标target的required目录中,使其开机自启
Alias: 当前Unit用于启动的别名
Also: 依赖关系-同时激活其他Unit

自定义一个Service文件

比如我现在要在启动系统时就启动一个脚本,并且让它重复不断运行,这个脚本叫k8s-check.sh

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
vim /usr/lib/systemd/system/k8s-check.service
[Unit]
Description: This is a k8s cluster check scrpit

[Service]
ExecStart=/root/k8s-check.sh --all -n prod --kubeconfig /root/config_aliyun
Restart=always
RestartSec=60

[Install]
WantedBy=multi-user.target

# 加载服务
systemctl daemon-reload
systemctl enable k8s-check.service --now
CATALOG
  1. 1. target
  2. 2. Service配置文件解析
    1. 2.1. [Unit]部分——定义Unit的元数据
    2. 2.2. [Service]部分——表示Unit的配置
    3. 2.3. [Install]部分——定义如何启动服务
  3. 3. 自定义一个Service文件