如何确定目录中的任何文件是否已更改

How to determine if any file in a directory has changed

Chef 有没有办法确定它是否更改了给定目录中的任何文件?如果更新 conf.d 目录中的任何设置,我想重新启动服务器进程。

我确定可以将 md5sums 列表写入每个 chef-client 运行 上的文件,并将当前迭代与之前的迭代进行比较。但这是解决看似常见情况的相当多的代码。有没有更好的方法?

您可以使用 inotify-tools 包中的 inotifywait 实用程序

Chef 提供了一个名为 notifications 的概念。

这允许您定义一个资源的更改触发另一个资源的执行。提到的在配置文件更改后重新启动服务可能是最常见的用例。

template "/etc/foo/conf.d/example.conf" do
    notifies :restart, "service[foo]"
end

service "foo" do
    supports :restart => true, :reload => true
    action :enable
end

默认情况下,通知是 :delayed,这意味着它们在 Chef 运行 结束时触发。这可以帮助您避免例如为每个更改的配置文件重新启动一次的服务。如果您想要立即通知,请使用

notifies :restart, "service[foo]", :immediately

当然,您不仅可以将 Chef 的通知用于服务,还可以用于任何资源。 documentation.

中给出了更多示例