我有一项服务突然停止了。我尝试重新启动该服务但失败并被要求运行:systemctl daemon-reload
。
它到底有什么作用?什么是daemon-reload
?
答案1
man systemctl 说:
守护进程重新加载
重新加载 systemd 管理器配置。这将重新运行所有生成器(请参阅 systemd.generator(7)),重新加载所有单元文件,并重新创建整个依赖关系树。重新加载守护进程时,systemd 代表用户配置侦听的所有套接字将保持可访问状态。
该命令不应与重新加载命令混淆。
所以,本质上来说,这是一次“软”重新加载;从文件系统获取更改的配置并重新生成依赖关系树。
因此,systemd.generator
指出:
生成器是位于 /usr/lib/systemd/user-generators/ 和上面列出的其他目录中的小型二进制文件。 systemd(1) 将在启动时和配置重新加载时很早就执行这些二进制文件 - 在加载单元文件之前。生成器可以动态生成单元文件或创建单元文件的符号链接以添加额外的依赖项,从而扩展或覆盖现有定义。它们的主要目的是将非本机单元文件的配置文件动态转换为本机单元文件。
生成器是从上面列出的编译期间确定的一组路径加载的。系统和用户生成器分别从名称以 system-generators/ 和 user-generators/ 结尾的目录加载。在前面列出的目录中找到的生成器会覆盖列表中较低目录中的同名生成器。 /dev/null 的符号链接或空文件可用于屏蔽生成器,从而阻止其运行。请注意,相对于单元加载路径而言,具有最高优先级的两个目录的顺序是相反的,并且 /run 中的生成器会覆盖 /etc 中的生成器。
安装新的生成器或更新配置后,可以执行 systemctl daemon-reload。这将删除生成器创建的先前配置,重新运行所有生成器,并导致 systemd 从磁盘重新加载单元。有关详细信息,请参阅 systemctl(1)。
答案2
如果您更改/lib/systemd/system/<servicename>.service
并重新启动
systemctl restart <servicename>.service
除非您执行systemctl daemon-reload
.相反,它只会重新启动旧的缓存设置,而不进行任何更改。
这已经让我们多次被烧伤了。人们只是重新启动服务,但忘记了它不会重新加载更改。
或者,您也可以重新启动整个系统,新重新启动的系统也将读取该服务的新配置。
答案3
注销时或重新启动之前,我将使用 /etc/fstab 进行简单测试。我只需从之前保存的值中检查其时间戳。您还可以记住之前计算的 sha1 和。
如上所述包含的脚本将有助于避免忘记运行守护进程重新加载。