有没有办法知道当前运行的配置是否已过时?有没有办法查看当前运行的配置并将其与文件进行比较?
在运行重新加载之前了解正在运行的配置对于故障排除很有帮助。如果命令能告诉我它是否真的更新了配置,那也很有用。
答案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=yes
或grep 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