systemd-analyze verify 是什么
systemd-analyze verify 是单元文件的静态检查器:解析指定的 .service、.timer、.socket,报出语法错误、拼错的指令名、ExecStart 指向的不存在或不可执行文件、依赖名拼写错误、找不到的 WantedBy 目标等。它不启动服务,也不覆盖端口冲突、权限、EnvironmentFile 缺失这类运行时问题,因此定位是 daemon-reload 之前的免费保险,而不是上线验证的替代品。
基本信息
| 适用平台 | Linux(systemd 系统,非 init.d/sysvinit 环境) |
|---|---|
| 权限要求 | 普通用户即可;检查系统级单元建议 sudo 以完整解析 |
| 语法 | systemd-analyze verify 单元名或单元文件路径 |
| 成功标志 | 无任何输出即通过 |
| 检查范围 | 语法、指令名、ExecStart 可执行性、依赖与目标名 |
典型使用场景
- 手写 unit 之后、systemctl daemon-reload 之前先过一遍
- 排查 Unit not found,确认文件名、单元名、WantedBy 三者是否对得上
- 从模板复制新单元时校验残留的旧服务名
- 检查 .timer 与其配对的 .service 是否同名同目录
- 系统升级后复核老单元里已被废弃的指令
常用示例
常用示例
systemd-analyze verify /etc/systemd/system/myapp.service # 用文件路径检查
systemd-analyze verify myapp.service # 用单元名检查
systemd-analyze verify myapp.timer # 连带检查它引用的 service 是否存在
systemd-analyze verify 'myapp@instance.service' # 模板单元要带实例名,否则报错误导
systemctl daemon-reload # verify 通过后再重载
systemctl restart myapp && systemctl status myapp --no-pager | head -n 15常见报错与处理
| 报错片段 | 含义 | 处理 |
|---|---|---|
| Unknown key name in section | 指令名拼错或当前 systemd 版本不支持 | 对照 man 5 systemd.service 改正;版本旧则该指令用不了 |
| Failed to prepare filename | 单元名与文件名不一致(复制后忘改名) | 文件名、[Unit] 段与 WantedBy 里的名字统一 |
| is not executable / 文件不存在 | ExecStart 路径写错、二进制未装或没有执行位 | 用绝对路径,并确认文件存在且有 x 权限 |
| dependency / target not found | 依赖或目标名拼写错误 | 用 systemctl list-unit-files 查真实存在的单元名 |
| bad unit file setting | 段名或语法结构有问题 | 检查 [Section] 是否闭合、每行是否为键值形式 |
verify 只看静态定义。端口被占、运行用户无权限、依赖服务未就绪、EnvironmentFile 文件缺失,都要等 systemctl start 才会暴露,静态通过之后仍要实跑一遍并核对 status 与日志。
改了单元文件必须 systemctl daemon-reload;不重载就 restart 时 systemd 仍用旧定义,很容易得出“配置改了没用”的错误结论。容器或精简系统里可能根本没有 systemd-analyze,先确认环境再判断是不是文件有问题。