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