ppet onlyif 与 pgrep 不起作用

ppet onlyif 与 pgrep 不起作用

我只想在 Puppet 的进程未运行时使用 exec

exec { "execute me":
    onlyif  => "pgrep -fc 'ruby execute.rb'",  
    command => "execute me",
}

因此,在上述情况下,如果进程“ruby execute.rb”已在运行,则 exec 不应运行为

pgrep -fc 'ruby execute.rb' will return 1.

然而

该命令似乎总是在 puppet 中运行。

在我的 Linux 机器上,当我执行 pgrep -fc 'ruby execute.rb' 时,我总是得到一个大于 0 的值。

我的命令有问题吗?

答案1

您的执行程序将运行仅当 pgrep 返回 0 时。pgrep 手册页告诉我们,只有当找到匹配的进程时,pgrep 的退出代码才会为零 (0),而当没有匹配的进程时,它将返回一 (1)。另一方面,puppet 文档告诉我们参数onlyif仅当参数中的命令返回 0 时才执行资源。

onlyif应该使用参数除非这样,只有当您的 pgrep 返回非零值(即,它找不到任何匹配的进程)时,您的 exec 才会运行。

exec { "execute me":
  unless  => "pgrep -fc 'ruby execute.rb'",  
  command => "execute me",
}

答案2

您是否尝试过使用完整路径:/usr/bin/pgrep?

也许 puppet 代理无法在 onlyif / except 语句中找到 pgrep 命令。也可以在 exec 资源类型中将命令搜索路径指定为属性路径https://docs.puppet.com/puppet/latest/reference/type.html#exec-attribute-path

exec { "execute me":
    onlyif  => "pgrep -fc 'ruby execute.rb'",  
    command => "execute me",
    path    => "/sbin:/usr/sbin:/usr/local/sbin:/usr/local/bin:/usr/bin:/bin",
}

相关内容