Service 检查服务是否已安装

Service 检查服务是否已安装,service,chef-infra,Service,Chef Infra,如何检查节点(debian和cent os/amazon)上是否安装了服务 如果安装了服务,我想停止并禁用它。如果服务不存在,我会在服务停止时遇到异常: Chef::Exceptions::Service:/etc/init.d/Service不存在 致意 André一个解决方案是在您的服务资源中添加: service "my_service" do action :stop,:disable only_if { File.exist?("/etc/init.d/my_service")

如何检查节点(debian和cent os/amazon)上是否安装了服务

如果安装了服务,我想停止并禁用它。如果服务不存在,我会在服务停止时遇到异常: Chef::Exceptions::Service:/etc/init.d/Service不存在

致意
André

一个解决方案是在您的服务资源中添加:

service "my_service" do
  action :stop,:disable
  only_if { File.exist?("/etc/init.d/my_service") }
end
另一个是保护资源本身的定义: 免责声明:对于本示例,这是未经测试的代码

service "my_service" do 
  action :stop,:disable
end.if File.exist?("/etc/init.d/my_service")
最后一个更直观

if File.exist?("/etc/init.d/my_service")
  service "my_service" do 
      action :stop,:disable
  end
end
第一个示例与其他示例之间的主要区别在于,第一个示例将在编译时向集合添加资源,而另一个示例仅在文件存在时才会添加资源,因此,如果文件不存在,则可以避免为该服务添加新对象

精确地说,最后两个解决方案有一个小缺点,如果另一个菜谱安装了服务,他们第一次就看不到它,因为在编译菜谱时,文件不在那里,因此您可能会在下次运行chef之前一直运行服务。

使用此选项进行检查

only_if { ::File.exist?("/etc/init.d/my_service") }

别忘了:Systemd改变了世界,包括您的服务规范位置。它不再是仅在一个位置的可预测文件名,而是应该存在于/usr/lib/systemd下的某个位置。如果您的系统受到systemd和文件.exist?()的影响,检查不起作用,请确保您正在查找正确的新位置。

要扩展和更新现有答案,请执行以下操作:如果您使用systemd,您仍然可以在警卫中检查文件,但它们将位于稍微不同的位置

您需要检查/usr/lib/systemd/system中是否存在名为“servicename.service”的文件(例如telnet.service、named.service等)

在资源中添加一个only_if语句,您就是黄金

例如:

service "service_name" do
  action :stop
  only_if { File.exist?("/usr/lib/systemd/system/service_name.service") }
end

如果{File.exist?(“/etc/init.d/service”)Tensibai,你可以用
在你的服务资源中充当守卫,如果你不把它放在一个答案中,我不能给你投票:(@TejayCardon answer done,用不同的方式更好地解释关于
shell的内容(“systemctl是活动的{service\u name}--quiet”).exitstatus==0
分叉一个shell来调用一个命令——无疑是为了打开更多的命令,然后我们就是Duggars——不仅是糟糕的编码,而且可能是丑陋的,它还与许多不同项目中的安全问题相关联。Systemd已经成长,像blob一样,并且消耗了nfs、cron和可能的pam或limits。接下来,也许他们有一个简单的l如果不是太无聊的话,那就去看科学吧?