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
3
4
5
6
7
8
# 修改了某个服务配置文件
vim /etc/systemd/system/myapp.service

# 重新加载配置
systemctl daemon-reload

# 再重启该服务
systemctl restart myapp

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
2
3
# 升级 systemd 后想让新版本生效
yum update systemd
systemctl daemon-reexec

类似“给 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),需要在稳定条件下使用。