自定义 systemd 单元核查
自定义 systemd 单元指向任意可执行文件,是持久化里最常见、也最容易被忽略的载体:一个 .service 文件加上 ExecStart 就能在开机或触发时运行指定程序,而且管理方式与系统服务完全一致,混在正常单元里很难一眼看出问题。排查重点是 /etc/systemd/system/ 下新增或近期被修改的单元,以及它们的 ExecStart、Restart、User 三个字段。
基本信息
| 目录 | /etc/systemd/system/(系统级)、~/.config/systemd/user/(用户级) |
|---|---|
| 关键字段 | ExecStart、ExecStartPre、Restart、User、WantedBy |
| 覆盖机制 | 同名单元以 /etc 为准,systemd-delta 可列出覆盖与扩展项 |
| 状态查询 | systemctl is-enabled 看开机自启,is-active 看当前是否运行 |
| 生效步骤 | 改动后需 systemctl daemon-reload,再 enable 或 restart |
典型使用场景
- 排查服务与 cron 之外的第三类常见持久化载体
- 定位某个不明进程由哪个单元启动、在何时被拉起
- 核对单元文件的创建与修改时间是否落在入侵窗口内
- 检查 ExecStart 指向程序的路径、属主与哈希是否可疑
- 处理反复重启的异常单元,弄清为何清理后仍会运行
核查与确认
核查与确认
ls -lt --time-style=long-iso /etc/systemd/system/ | head -20 # 近期新增或修改的单元
systemd-delta --type=overridden | head -20 # 被覆盖、被扩展的系统单元
systemctl cat custom.service # 单元内容与文件来源
systemctl show custom.service -p ExecStart -p User -p Restart -p WantedBy # 关键字段
systemctl is-enabled custom.service; systemctl is-active custom.service # 自启与运行状态关键字段读法
| 字段 | 含义 | 异常参考 |
|---|---|---|
| ExecStart | 实际执行的命令与参数 | 指向临时目录、用户家目录或带解释器包装 |
| Restart | 进程退出后的重启策略 | always 会让清理不彻底,禁用要连策略一起改 |
| User | 以哪个账号运行 | 普通业务单元使用 root 需重点确认 |
| WantedBy | 被哪个 target 拉起 | multi-user.target 表示开机即启动 |
| Condition 与 Path | 附加触发条件 | 状态变化即触发,排查时容易忽视 |
systemd-delta 会列出被覆盖(overridden)、被扩充(extended)的单元,可快速发现发行版原生单元被改写的情况,比逐个目录人工比对省时且不易漏项。
改动或删除单元后必须执行 systemctl daemon-reload 才生效;只删文件而未重载、未停止服务,运行中的进程仍按内存中的定义继续执行,此时复扫结果会与实际状态不一致。