web-dev-qa-db-ja.com

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より大きい値が取得されます。

私のコマンドに何か問題がありますか?

3

Execが実行されますpgrepが0を返した場合のみ。 pgrepのマニュアルページには、一致するプロセスが見つかった場合にのみpgrepの終了コードがゼロ(0)になり、一致するプロセスがない場合に1が返されることが示されています。一方、puppetのドキュメントによると、 parameter onlyif を指定すると、パラメーターのコマンドが0を返した場合にのみリソースが実行されます。

onlyifの代わりに パラメータでない限り を使用する必要があります。そうすれば、pgrepがゼロ以外を返したときにのみexecが実行されます。一致するプロセスが見つかりません。

exec { "execute me":
  unless  => "pgrep -fc 'Ruby execute.rb'",  
  command => "execute me",
}
5
Sami Laine

フルパス/ usr/bin/pgrepを使用してみましたか?

おそらく、パペットエージェントはonlyif/unlessステートメントで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",
}
2
fieldsa