systemctl daemon-reexec vs systemctl daemon-reload区别
一句话总结:
daemon-reload是让 systemd 重新加载配置文件,daemon-reexec是让 systemd 自身重新执行(自我重启)。
1.systemctl daemon-reload
作用:
让 systemd 重新加载 unit 文件配置(即 /etc/systemd/system/*.service、/lib/systemd/system/*.service 等)。
当你修改了 .service、.socket、.mount 等 unit 文件后,需要执行:
1 | systemctl daemon-reload |
本质行为:
- 不会重启 systemd 进程;
- 只是让 systemd 重新扫描并解析所有 unit 文件;
- 已加载的服务如果没变化,不会受到影响;
- 新增、修改或删除的 unit 才会更新 systemd 的内存结构。
场景示例:
1 | # 修改了某个服务配置文件 |
2.systemctl daemon-reexec
作用:
让 systemd 自身重新执行二进制文件(即 /usr/lib/systemd/systemd)。
换句话说:
它会让 PID 1(systemd)进程执行一次 exec() 系统调用,替换为新的 systemd 程序镜像,但 保持原有运行状态不变。
本质行为:
- 不退出 PID 1,也不重新启动机器;
- 会重新加载 systemd 的程序代码(通常用于升级 systemd 本身);
- 所有现有服务、套接字、挂载点等继续保持;
- 是一种 平滑替换(graceful re-exec);
- 主要用于修复 systemd bug 或在升级后使新版本 systemd 生效,而无需 reboot。
场景示例:
1 | # 升级 systemd 后想让新版本生效 |
类似“给 systemd 本身热更新”的作用。
3.总结对比表
| 命令 | 主要作用 | 是否重启 systemd | 是否影响正在运行的服务 | 典型使用场景 |
|---|---|---|---|---|
systemctl daemon-reload |
重新加载 unit 配置文件 | ❌ 否 | ❌ 否(配置生效需手动重启服务) | 修改 .service 文件后 |
systemctl daemon-reexec |
重新执行 systemd 自身(热重启) | ✅ 是(同 PID) | ⚠️ 否(保持状态) | 升级 systemd 后或修复 systemd 异常 |
4.实践建议
- 修改服务配置 → 用
daemon-reload - 升级 systemd 包 → 用
daemon-reexec - 调试或修复 systemd 本身异常 → 可尝试
daemon-reexec - 不要滥用
daemon-reexec,因为它影响的是系统的核心进程(PID 1),需要在稳定条件下使用。