我如何知道是否需要运行 systemctl daemon-reload

我如何知道是否需要运行 systemctl daemon-reload

有没有办法知道当前运行的配置是否已过时?有没有办法查看当前运行的配置并将其与文件进行比较?

在运行重新加载之前了解正在运行的配置对于故障排除很有帮助。如果命令能告诉我它是否真的更新了配置,那也很有用。

答案1

您可以通过命令检查已加载的单元systemctl show <unit>.service。据我所知,没有工具可以检查单元文件中的更改。

您也可以运行这个 bash 命令,for var in $(systemctl | grep running | awk '{print $1}'); do systemctl status $var | grep "changed on disk" | grep ".service"; done它会显示哪些文件已被更改。

例子:

[root@centos-linux atolkachev]# for var in $(systemctl | grep running | awk '{print $1}'); do systemctl status $var | grep "changed on disk" | grep ".service"; done
Warning: nginx.service changed on disk. Run 'systemctl daemon-reload' to reload units.

答案2

这对我有用:

systemctl [--user] show [unit name] --property=NeedDaemonReload

或者

systemctl [--user] show [unit name] | grep NeedDaemonReload=

如果需要重新加载,则会输出“NeedDaemonReload=yes”。

如果您使用 grep 方法,您可以将最后一部分更改为grep NeedDaemonReload=yesgrep NeedDaemonReload=no使其在不匹配时不输出任何内容(更容易用于脚本)。

你可能还想用CanStart

答案3

systemd不提供显示已更改的单元文件的开箱即用支持,但您可以使用如下 bash 脚本:

while read unit; do
    systemctl status $unit 2>&1 | awk '/changed on disk/ {print $2}'
done< <(systemctl list-unit-files | grep \.service | awk '{print $1}')

答案4

如果需要运行,此行将执行 systemctl daemon-reload:

for service in $(systemctl | grep running | grep .service | awk '{print $1}'); do ! test "$mayreload" && systemctl status $var 2>&1 | grep -q "changed on disk" && && mayreload=1 && echo reloading systemctl && systemctl daemon-reload ; done

相关内容