0%

systemd笔记

前言

记录汇总一下 systemd的相关操作和写法

https://wiki.archlinuxcn.org/wiki/Systemd archWiki中systemd文档
https://man.archlinux.org/man/systemctl.1 systemctl 详解
https://man.archlinux.org/man/systemd.unit.5 systemd unit文档

systemctl

本机通过ssh控制远程systemd systemctl -H 用户名@主机名 status <服务名> ?学到了 6

命令 & 选项 作用 使用场景/额外说明
systemctl start <服务名> 启动指定服务 当需要手动启动某个服务时使用。
systemctl stop <服务名> 停止指定服务 当需要关闭某个正在运行的服务时使用。
systemctl restart <服务名> 重启服务 当修改了服务配置文件或遇到服务故障需重新加载时使用。
systemctl reload <服务名> 重新加载配置而不重启服务 当仅修改了服务配置,希望立即应用新配置但不中断服务时使用。
systemctl status <服务名> 查看服务状态及日志 用于诊断服务问题,查看服务是否正常运行及最近的日志输出。
systemctl enable <服务名> 开机自启服务 设置服务在系统启动时自动启动。
systemctl disable <服务名> 取消开机自启 如果不再需要服务自动启动,使用此命令取消。
systemctl daemon-reload 重载 systemd 配置 当修改了服务单元文件后,需执行此命令让 systemd 重新读取配置。
systemctl list-units --type=service 列出所有服务状态 快速查看系统中所有服务的当前状态。
systemctl list-unit-files 查看所有服务的启动配置 查看哪些服务设为启用或禁用。
systemctl is-active <服务名> 检查服务是否正在运行 快速确认服务状态。
systemctl is-enabled <服务名> 检查服务是否设置为启用 确认服务是否配置为开机启动。
systemctl mask <服务名> 禁用并阻止服务启动 强制禁用服务,通过创建符号链接到 /dev/null 实现。
systemctl unmask <服务名> 解除服务的屏蔽 恢复被 mask 命令禁止的服务。
systemctl edit <服务名> 在编辑器中直接修改服务配置 方便地编辑服务单元文件,没有文件则创建新的 drop-in 文件。
systemctl cat <服务名> 查看服务配置文件内容 不直接修改,仅查看服务的配置信息。
systemctl show <服务名> 显示服务详细属性 包括依赖关系、环境变量、单元文件路径等详细信息。
systemctl kill <服务名> --signal=<信号> 发送信号给服务进程 SIGTERM 优雅终止,SIGHUP 重新加载配置。
systemctl --failed 列出启动失败的服务 快速定位系统启动过程中未能成功启动的服务。

unit

unit搜索目录
  • 系统级别
1
2
3
4
5
6
7
8
9
10
11
12
/etc/systemd/system.control/*
/run/systemd/system.control/*
/run/systemd/transient/*
/run/systemd/generator.early/*
/etc/systemd/system/*
/etc/systemd/system.attached/*
/run/systemd/system/*
/run/systemd/system.attached/*
/run/systemd/generator/*
...
/usr/lib/systemd/system/*
/run/systemd/generator.late/*
  • 用户级别
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
~/.config/systemd/user.control/*
$XDG_RUNTIME_DIR/systemd/user.control/*
$XDG_RUNTIME_DIR/systemd/transient/*
$XDG_RUNTIME_DIR/systemd/generator.early/*
~/.config/systemd/user/*
$XDG_CONFIG_DIRS/systemd/user/*
/etc/systemd/user/*
$XDG_RUNTIME_DIR/systemd/user/*
/run/systemd/user/*
$XDG_RUNTIME_DIR/systemd/generator/*
$XDG_DATA_HOME/systemd/user/*
$XDG_DATA_DIRS/systemd/user/*
...
/usr/lib/systemd/user/*
$XDG_RUNTIME_DIR/systemd/generator.late/*
unit类型
Unit 类型 描述
.service 服务单元,代表系统服务,如守护进程。
.target 目标单元,作为一组单元的集合,实现运行级别概念。
.path 路径单元,监控文件或目录变化,触发动作。
.timer 定时单元,按照时间计划触发其他Unit。
.mount 挂载单元,管理文件系统的挂载。
.automount 自动挂载单元,访问时自动挂载文件系统。
.swap 交换单元,管理交换空间。
.device 设备单元,表示硬件设备。
.socket 套接字单元,监听网络或本地套接字。
.slice 临时文件集单元,组织和管理系统资源(cgroups)。
.job 作业单元,表示由systemd发起的任务。
.conf 配置单元,覆盖或补充其他Unit的配置。
.scope 范围单元,不由systemd直接管理的进程组。
.netdev 网络设备单元,配置网络设备。
.network 网络接口单元,配置网络接口。
.link 链接单元,网络链接命名规则。
.snapshot 快照单元,系统状态的快照,支持回滚。
.seat 坐席单元,物理或逻辑终端座位。
.session 会话单元,表示用户会话。
.listen 监听单元,监听特定事件或条件(较少见)。
unit 内容字段说明
[Unit] 部分字段说明
字段 说明
Description 单元的简短描述文本。
After/Before 控制启动顺序,After指本单元应晚于列出单元启动,Before则相反。
Requires 指定必需的依赖单元,这些单元必须启动成功本单元才能启动。
Wants 推荐的依赖单元,这些单元启动或失败不影响本单元启动。
Conflicts 与本单元冲突的单元,这些单元启动时本单元将被停止。
BindsTo 本单元与指定单元绑定,它们的生命周期相互关联。
[Service] 部分字段说明
字段 说明
Type 服务类型,如 simple, forking, oneshot 等。
ExecStart 启动服务的命令。
ExecStop 停止服务的命令。
Restart 重启策略,如 always, on-failure, no
User 以指定用户身份运行服务。
Group 以指定组身份运行服务。
WorkingDirectory 服务的工作目录。
[Socket] 部分字段说明
字段 说明
ListenStream 监听的TCP端口或Unix域套接字路径。
ListenDatagram 监听的UDP端口或Unix域套接字路径。
BindToDevice 将套接字绑定到特定的网络设备。
[Timer] 部分字段说明
字段 说明
OnCalendar 定时触发的时间规则,如 *-*-* *:*:* 表示每天每分钟。
AccuracySec 触发的准确度,即最小触发间隔。
RandomizedDelaySec 触发延迟的随机化秒数,减少同时启动压力。
[Mount] 部分字段说明
字段 说明
What 挂载源路径,如设备文件名。
Where 挂载点路径。
Type 文件系统类型,如 ext4, nfs
Options 挂载选项,如 ro, noatime
[Install] 部分字段说明
字段 说明
WantedBy 本单元希望加入的目标单元,如 multi-user.target
RequiredBy 需要本单元的目标单元,这些单元启动时本单元也必须启动。

常用的unit文件demo

  • service
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[Unit]
Description=My Application Service
After=network.target

[Service]
Type=simple
ExecStart=/usr/local/bin/myapp start
ExecStop=/usr/local/bin/myapp stop
Restart=always
User=myappuser
Group=myappgroup
WorkingDirectory=/var/lib/myapp

[Install]
WantedBy=multi-user.target
  • timer
1
2
3
4
5
6
7
8
9
[Unit]
Description=Daily Cleanup Task

[Timer]
OnCalendar=*-*-* 00:00:00
Persistent=true

[Install]
WantedBy=timers.target
  • path
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[Unit]
Description=Monitor Log File for Changes

[Path]
PathChanged=/var/log/application.log

[Install]
WantedBy=multi-user.target

[Unit]
Description=Log Watch Action

[Service]
Type=oneshot
ExecStart=/usr/local/bin/logwatcher /var/log/application.log

[Install]
WantedBy=logwatch.path
  • automount
1
2
3
4
5
6
7
8
[Unit]
Description=Auto Mount for Data Disk

[Automount]
Where=/mnt/data

[Install]
WantedBy=multi-user.target
  • mount
1
2
3
4
5
6
7
8
9
10
11
[Unit]
Description=Data Disk Mount

[Mount]
What=/dev/sdb1
Where=/mnt/data
Type=ext4
Options=noatime

[Install]
WantedBy=multi-user.target

个人常用记录

  • alist.service

/usr/lib/systemd/system/alist.service

1
2
3
4
5
6
7
8
9
10
11
12
[Unit]
Description=alist
After=network.target

[Service]
Type=simple
WorkingDirectory=/home/ming/alist
ExecStart=/home/ming/alist/alist server
Restart=on-failure

[Install]
WantedBy=multi-user.target

总结

systemd 成为linux下的标准事实了 没啥好说的
重量级 不过用起来简单
常用的 也就service timer