Ruby 如果windows服务正在运行,我是否可以使用卫兵来管理?

Ruby 如果windows服务正在运行,我是否可以使用卫兵来管理?,ruby,chef-infra,chef-recipe,Ruby,Chef Infra,Chef Recipe,我正在写一份厨师食谱,只有在服务不起作用的情况下,我才需要执行一个操作(运行一批)。 我使用这个片段: batch 'run commnad' do cwd target_path + '/bin/win64' code 'command to be executed' not_if '::Win32::Service.exists?("Service name")' end 但它似乎不起作用。在看到问题后,我使用if子句而不是guard更改了流程,它运

我正在写一份厨师食谱,只有在服务不起作用的情况下,我才需要执行一个操作(运行一批)。 我使用这个片段:

batch 'run commnad' do
  cwd target_path + '/bin/win64'
    code 'command to be executed'
    not_if '::Win32::Service.exists?("Service name")'
end
但它似乎不起作用。在看到问题后,我使用if子句而不是guard更改了流程,它运行良好:

if !::Win32::Service.exists?("Service name") then
  batch 'Install zabbix agent' do
    cwd target_path + '/bin/win64'
    code 'command to be executed'
  end
end
但据我所知,这不应该是正确的管理方法,所以我想知道:为什么守卫不能正常工作

谢谢,
Michele.

如果语句以shell脚本的形式运行命令,那么您编写
的方式就不是了。
shell不知道Ruby代码,因此整个命令都会失败。
首先需要:

需要win32/服务

为了在Ruby代码中使用
not\u if
,您应该将其放在块中:

not_if { ::Win32::Service.exists?("Service name") }
请参阅此处的更多示例(如果页面上的
未搜索):

以下是工作示例(厨师长13)


{}解决了这个问题。我没有想到这一点。谢谢如果您想做得更好,还可以在批处理资源调用中附加一个条件,即
batch'run command'do。。。结束,除非
   require 'win32/service'
   windows_service "jenkins" do
      action [:stop, :disable]
      only_if { ::Win32::Service.exists?("jenkins")}
   end