<![CDATA[
systemd 是一个 2010 年诞生的系统和服务管理器,广泛用于现代Linux发行版中,负责启动和管理系统的用户空间服务、挂载文件系统、启动并管理设备、以及其他系统初始化任务
作为取代 init 系统的系统项目,systemd 通过单一的控制进程(systemd进程)来管理系统的生命周期,其采用 ini 配置文件来描述和管理服务
现代大部分 Linux 系统都由 systemd 启动和管理
1. 入门1.1. 一个例子
以 sshd 服务为例,控制其启动、关闭、和重启:
sudo systemctl stop sshd
sudo systemctl start sshd
sudo systemctl restart sshd
# 检查 sshd 的服务状态
sudo systemctl status sshd
接下来,以配置一个 easydns 程序服务为例
编辑: /etc/systemd/system/easydns.service
[Unit]
# 服务描述
Description=easydns service
# 启动顺序
After=network.target
[Service]
# 执行命令
ExecStart=/root/easydns/easydns -m=127.0.0.1:1080 -p=116.116.116.116:53 -d=/root/easydns/gfw-list.txt -l=10240 -hosts=/root/easydns/hosts -ipv6=true
# 退出机制
Restart=unless-stopped
# 内存限制
MemoryMax=64M
# 日志输出 %N表示服务名称,所以日志输出位置是 /var/log/easydns.log
StandardOutput=append:/var/log/%N.log
# 重定向错误日志到标准流
StandardError=inherit
# 运行用户
User=root
[Install]
# 启动类型
WantedBy=multi-user.targe
1.2. 例子解析
Unit 用于定义程序的基本属性和元数据,常见选项:
- Description:单元的简短描述
- Documentation:相关文档的链接
- After:定义单元启动的顺序,表示当前单元在指定单元之后启动
- Before:定义单元启动的顺序,表示当前单元在指定单元之前启动
- Requires:表示当前单元依赖于其它单元,如果依赖的单元未能启动,当前单元也不会启动
- Wants:类似于 Requires,但不那么严格,依赖的单元如果未能启动,当前单元仍然会尝试启动
Service 用于定义服务的行为(如执行命令、环境变量、运行用户),常见选项:
- ExecStart:指定启动该服务时执行的命令
- ExecStop:指定停止该服务时执行的命令
- Restart:服务崩溃后的重启策略(如 always、on-failure 等)
- RestartSec:服务重启的延迟时间(单位秒)
- User:以哪个用户身份运行该服务
- StandardOutput:输出日志方式
- Environment:设置环境变量
- WorkingDirectory:指定工作目录
- Type:服务的类型(如 simple、forking、oneshot、notify、dbus)
Install 用于控制服务的启用和禁用策略,常见选项:
- WantedBy:指定该服务单位希望在启动时被哪些目标所激活
- RequiredBy:指定该服务单位是哪些单位所依赖的
2. Unit、Service、Install 指南
2.1. Unit
After 和 Before 都是用于描述启动顺序,即程序在什么情况下启动,常见的值有:
- basic.target:基础的系统服务启动
- multi-user.target:多用户模式,适用于无图形界面的系统
- graphical.target:图形用户界面模式,依赖于 multi-user.target
- network-online.target:网络连接完全建立
- remote-fs.target:远程文件系统挂载
- local-fs.target:本地文件系统挂载
- shutdown.target:系统正在关闭
- reboot.target:系统正在重启
- network.service:网络服务启动完成
- dbus.service:D-Bus 服务启动
- systemd-journald.service:日志记录服务启动
- systemd-logind.service:用户登录管理服务
After 即程序在指定情况后启动,Before 则是在指定情况前启动
2.2. Service
Restart 用于描述程序在退出之后的操作,常见值:
- no:默认值,不采取任何操作
- always:重启服务
- on-success:正常退出(状态码为0)则重启
- on-failure:非正常退出(状态码不为0)则重启
- on-abort:服务未捕捉到任何信号(如SIGKILL 或 SIGQUIT)而退出时重启
- on-watchdog:仅在服务因未响应 watchdog 超时而退出时重启
Environment 用于设置程序的环境变量,如果环境变量过多,可以使用 EnvironmentFile 选项用于指定一个环境变量的文件路径
Type 用于帮助 systemd 判定服务是否启动成功,常见值:
- simple:启动后不需要任何信号即认为启动成功
- forking:当服务进程fork出一个主进程并退出,适用于传统的UNIX守护进程,它们会fork并在后台运行
- oneshot:服务执行一次后即退出,适合一次性脚本
- notidy:服务启动后会通过
sd_notidy
通知 systemd,适合与 systemd 进行复杂交互的程序
- idle:服务在其他任务执行完毕后再执行,低优先级的任务
2.3. Install
常见的 WantedBy 和 RequiredBy 值包括:
- multi-user.target:这是最常用的目标,表示系统已进入多用户模式,但没有图形界面,通常用于服务器或没有图形界面的系统
- graphical.target:表示用户进入了图形界面
- basic.target:表示系统的基本初始化已完成,但没有进入多用户模式
- default.target:这是系统启动时的默认目标,通常是 graphical.target 或 multi-user.target 的别名
- sysinit.target:表示系统初始化阶段的目标,通常在系统启动的早期阶段使用
- network.target:在网络已初始化后使用,适用于需要网络连接的服务
- remote-fs.target:用于启动远程文件系统的挂载
RequiredBy 的用法与 WantedBy 类似,但它表示服务是目标的必须依赖项,如果目标被激活,则这个服务也必须被激活RequiredBy 一般用于更严格的依赖关系
这两者与 Unit 中的 Before 和 After 非常相似,但区别很大:
- After 和 Before:用于控制启动顺序,确保单元在特定的时间点启动
- RequiredBy 和 WantedBy:用于定义单元的依赖关系,主要影响单元的启用和禁用行为
3. 日志配置
systemd 使用 journald 进行日志管理,你可以通过以下命令查看日志:
# 查看所有日志
journalctl
# 查看特定服务日志
journalctl -u <service_name>