5 4 月 2026, 周日

简述:

Systemd 是现代 Linux 系统中广泛使用的系统和服务管理器,用于初始化系统、管理系统服务和进程。它取代了传统的 SysVinit 和 Upstart,成为许多主流 Linux 发行版(如 RHEL、CentOS、Ubuntu、Fedora)的默认初始化系统。

常用命令:

命令 说明
systemctl start <服务> 启动服务
systemctl stop <服务> 停止服务
systemctl restart <服务> 重启服务
systemctl enable <服务> 开机自启动
systemctl disable <服务> 禁止开机启动
systemctl status <服务> 查看服务状态
systemctl list-units --type=service 列出所有服务单元
journalctl -xe 查看详细日志
systemctl daemon-reload 重新加载 systemd 配置文件

主要特点:

特点 说明
并行启动 系统启动时能够并行启动服务,提高启动速度。
按需启动 仅在需要时启动服务,减少资源消耗。
服务依赖管理 服务之间的启动顺序、依赖关系通过单元文件(unit files)定义,实现精准控制。
统一管理接口 通过 systemctl 命令统一管理系统服务、挂载点、设备、定时任务等。
日志管理 集成 journald,支持二进制格式日志,方便日志收集与分析。
动态设备管理 udev 集成,支持热插拔设备的自动配置。
用户空间实例 支持用户级 systemd 实例(systemd --user),方便管理用户自身的服务。
支持 cgroups 与 Linux 内核的 cgroups 控制组紧密结合,限制、监控和管理服务的资源使用。
超时和自动重启 服务启动超时或失败后,可自动重启,提高服务可靠性。

单元基本概念:

Unit(单元)systemd 的配置文件单位,用于描述服务、挂载点、设备、套接字等。

单元类型 文件扩展名 用途
服务单元 .service 启动和管理后台服务(如守护进程)
目标单元 .target 定义系统状态和多个服务的组合
套接字单元 .socket 管理套接字及其相关服务的激活机制
设备单元 .device 管理和控制硬件设备
挂载单元 .mount 文件系统挂载点
自动挂载单元 .automount 延迟挂载文件系统
路径单元 .path 监控文件路径变化并触发相关服务
定时器单元 .timer 定时执行任务(类似于 cron)
切片单元 .slice 管理进程的资源限制
作用域单元 .scope 管理外部进程的资源

常用单元模版:

服务单元模版

/etc/systemd/system/mytask.service

[Unit]
Description=定时运行的自定义脚本任务 # 服务描述信息,在 `systemctl status` 时显示
After=network.target              # 定义服务启动的时机,这里是网络启动后

[Service]
ExecStart=/usr/bin/bash /path/to/myscript.sh # 运行的命令或脚本
WorkingDirectory=/path/to/                  # 指定工作目录,脚本内的相对路径从这里开始
User=root                                   # 以 root 用户运行该服务
Group=root                                  # 指定用户组,通常和 User 一致
Restart=on-failure                          # 设置失败时自动重启策略,on-failure 表示失败时重启
Environment="ENV_VAR_NAME=value"            # 设置环境变量,可选

[Install]
WantedBy=multi-user.target                   # 指定目标环境,默认多用户环境下启动

定时器单元模版

/etc/systemd/system/mytask.timer

[Unit]
Description=定时触发 mytask.service 服务的定时器 # 定时器描述信息

[Timer]
OnCalendar=*-*-* 03:00:00      # 定时触发时间,cron-like 表达式,表示每天凌晨 3 点
Persistent=true                 # 系统关机错过任务后,下次开机自动补跑一次
Unit=mytask.service             # 明确指定触发的服务单元文件名(通常同名,可以省略)

[Install]
WantedBy=timers.target           # 表示定时器将在系统启动时启动(类似 cron)

常见的时间表达式 OnCalendar

表达式 含义
*-*-* 03:00:00 每天凌晨 3 点
*-*-* *:00:00 每小时的整点
Mon *-*-* 04:00:00 每周一凌晨 4 点
*-*-01 05:00:00 每月 1 号凌晨 5 点
*-*-* 00,06,12,18:00:00 每天 0 点、6 点、12 点、18 点
2025-02-17 12:00:00 特定时间点,仅执行一次

docker 服务的状态实例图:

Avatar photo

sion932