修改 /etc/systemd/system.conf 后必须执行 systemctl daemon-reexec 才能生效,因为该文件定义 systemd 自身行为,daemon-reload 仅刷新服务单元文件,无法更新 systemd 主进程的运行时配置。

修改 systemd 配置文件后,不能直接生效,必须通过明确命令通知 systemd 重新读取配置。关键在于区分两类配置:一类是服务单元文件(如 .service),另一类是 systemd 自身的运行时配置(如 /etc/systemd/system.conf)。它们的重载方式不同,用错命令会导致配置看似修改却无效。
修改了 .service 或其他单元文件?用 daemon-reload
当你编辑了 /etc/systemd/system/nginx.service、新增了自定义单元,或调整了依赖关系,就需要让 systemd 重新扫描并加载这些定义:
- 执行
sudo systemctl daemon-reload - 该命令只刷新内存中的单元定义,不重启任何服务
- 之后才能正确执行
systemctl start/restart/enable等操作 - 若跳过此步,systemctl 仍按旧配置运行,即使文件已改也不会识别
修改了 /etc/systemd/system.conf 或 journald.conf?用 daemon-reexec
这类全局配置控制 systemd 主进程行为(如日志大小、默认超时、cgroup 设置),daemon-reload 对它们完全无效:
- 执行
sudo systemctl daemon-reexec - 它会用新配置重新启动 systemd 主进程自身,但保持所有子服务持续运行
- 毫秒级完成,无服务中断,比整机 reboot 或 systemctl restart multi-user.target 更安全
- 可配合
systemd-path system-configuration确认当前生效的主配置路径
想让某个服务应用自己的新配置?用 reload(前提是服务支持)
这和上面两类都不同——它是向服务进程发信号,让它自己重新读取业务配置文件(如 Nginx 的 nginx.conf、PostgreSQL 的 postgresql.conf):
- 执行
sudo systemctl reload nginx或sudo systemctl reload postgresql - 是否成功取决于服务单元中是否定义了
ExecReload=,可用systemctl show nginx | grep ExecReload查看 - 不支持 reload 的服务(如某些自研程序)会报错或退化为 restart;此时需先确认其热重载机制(如 Redis 用
redis-cli CONFIG SET,PostgreSQL 用SELECT pg_reload_conf())
常见误操作与验证方法
配置没生效,往往不是命令没敲对,而是没走对路径:
- 改了
/etc/nginx/nginx.conf却只运行daemon-reload→ 错,应systemctl reload nginx - 改了
/etc/systemd/system.conf却只运行reload nginx→ 错,应daemon-reexec - 不确定是否生效?查
systemctl show --property=Environment,DefaultTimeoutStartSec(对应 system.conf 中设置)或journalctl -u systemd | tail -5看 reexec 日志 - 单元文件语法错误?
systemd-analyze verify /etc/systemd/system/myapp.service可提前检测











