systemctl daemon-reload仅刷新systemd配置认知,不重启服务;真正热更新需配合systemctl reload(服务支持时)或reload-or-restart(不支持时),且依赖关系变更必须先执行daemon-reload才生效。

systemctl daemon-reload 本身不热更新守护进程,也不影响正在运行的服务——它只刷新 systemd 的“配置认知”,是热更新流程的必要前置动作,而非热更新本身。
真正实现“不重启守护进程、无损更新依赖关系”的关键,在于 daemon-reload + reload(或 reload-or-restart)的组合使用,且依赖服务自身是否支持热重载。以下是具体逻辑和操作要点:
一、daemon-reload 的作用边界必须清楚
- 它仅重新读取
/etc/systemd/system/、/usr/lib/systemd/system/等路径下的所有.service、.target、.socket等 unit 文件; - 不启动、不停止、不重启任何服务;
- 不改变已运行进程的状态或 PID;
- 但后续所有 systemctl 操作(如 start/reload/status)都将基于新配置生效。
✅ 正确场景:你刚修改了
nginx.service中的Environment=或ExecReload=,执行sudo systemctl daemon-reload后,再systemctl reload nginx才能触发新 reload 行为。
❌ 错误期待:只执行daemon-reload就让 Nginx 自动加载新配置——不会发生。
二、单元依赖树的“无损更新”靠 reload 触发,而非 reload 命令本身
systemd 的依赖树(如 After=network.target、Wants=mysqld.service)在 daemon-reload 后立即更新,但运行时依赖关系不会自动重协商。真正影响依赖行为的,是以下两类操作:
-
对支持 reload 的服务执行
systemctl reload xxx.service- systemd 向其主进程发送
SIGHUP(或按ExecReload=自定义信号); - 服务自行决定是否重读配置、是否重建内部依赖(如重新解析
include的 conf.d 片段、重连上游依赖项); - 过程中服务持续响应请求,连接不断,PID 不变。
- systemd 向其主进程发送
-
对不支持 reload 的服务,用
systemctl reload-or-restart xxx.service- systemd 先尝试
reload;失败则自动 fallback 到restart; - 重启虽中断服务,但因依赖树已通过
daemon-reload更新,新启动的服务将按最新 unit 关系初始化(例如新加入的BindsTo=redis.service会生效)。
- systemd 先尝试
三、确保依赖树变更真正生效的实操要点
- 修改
.service文件后,必须daemon-reload——否则systemctl list-dependencies xxx显示的仍是旧关系; - 若修改的是
.target或.wants/符号链接(如ln -sf /dev/null /etc/systemd/system/multi-user.target.wants/old.service),同样需daemon-reload; - 检查依赖是否更新:
systemctl list-dependencies --reverse nginx.service # 查谁依赖 nginx systemctl show nginx.service | grep -E "(After|Wants|Requires)" # 查其依赖项
- 注意:
daemon-reload不会触发systemctl restart xxx的级联重启,除非你显式调用或 unit 中设置了Restart=always且进程意外退出。
四、典型安全热更新流程(以 Nginx 为例)
- 编辑
/etc/nginx/nginx.conf或/etc/nginx/conf.d/app.conf; - 验证语法:
sudo nginx -t; - 更新 unit 文件(如加
Environment="NGINX_ENV=prod")→ 保存; -
sudo systemctl daemon-reload; -
sudo systemctl reload nginx; - 验证:
systemctl is-active nginx仍为active,journalctl -u nginx --since "1 minute ago"无 error,curl -I localhost返回正常。
不复杂但容易忽略

















