Я хочу использовать 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.
тем не мение
Кажется, что команда всегда выполняется в марионеточном режиме.
В моем Linux-окне, когда я выполняю pgrep -fc 'ruby execute.rb', я всегда получаю значение больше 0.
Что-то не так с моей командой?
Ваш exec запустится только если pgrep возвращает 0. Страница руководства pgrep сообщает нам, что код выхода для pgrep будет равен нулю (0) только при обнаружении совпадающих процессов, и он вернет единицу (1), если подходящих процессов нет. С другой стороны, документация по марионетке сообщает нам, что параметр только если вызывает выполнение ресурса только тогда, когда команда в параметре возвращает 0.
Вместо того onlyif
вы должны использовать параметр, если. Таким образом, ваш exec будет работать только тогда, когда ваш pgrep вернет ненулевое значение, т.е. он не находит подходящих процессов.
exec { "execute me":
unless => "pgrep -fc 'ruby execute.rb'",
command => "execute me",
}
Вы пробовали использовать полный путь: / usr / bin / pgrep?
Возможно, марионеточный агент не может найти команду pgrep в операторе onlyif / except. Также можно указать путь поиска команд в типе ресурса 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",
}