web-dev-qa-db-ja.com

ansibleで実行可能ファイルをデーモン化する

&を使用してデーモンモードで実行可能ファイルを実行するシェルコマンドを実行するタスクをansibleで作成しようとしています。次のようなもの

-name: Start daemon
  Shell: myexeprogram arg1 arg2 &

私が見ているのは、私が保持し、タスクがすぐに戻り、プロセスが開始されていない場合です。削除してアンシブルタスクを返すと、かなりの時間待機します。

Ansibleを介してデーモンモードでプログラムを起動する適切な方法についての提案に感謝します。 Plsは、これをサービスとして実行するのではなく、特定の条件に基づいたアドホックなバックグラウンドプロセスとして実行することに注意してください。

21
user3364247

「&」でプログラムを実行しても、プログラムはデーモンにならず、単にバックグラウンドで実行されます。 「真のデーモン」を作成するには、プログラムで here の手順を実行する必要があります。

プログラムがCで作成されている場合、daemon()関数を呼び出すことができます。その後、最後に「&」がなくてもプログラムを開始でき、デーモンとして実行されます。

もう1つのオプションは、 daemon を使用してプログラムを呼び出すことです。これにより、ジョブも実行されます。

- name: Start daemon
  Shell: daemon -- myexeprogram arg1 arg2
17
Karel Jakubec

(またはAnsible)をログアウトしても、バックグラウンドで実行されている場合でも、実行中のプロセスに終了信号が送信されます。

Nohupを使用してこれを回避できます。

- name: Start daemon
  Shell: Nohup myexeprogram arg1 arg2 &

http://en.wikipedia.org/wiki/Nohup

12
udondan

達成したいことの簡単な説明から、実行可能ファイルをサービスとして設定し(Upstartまたは同様のものを使用)、それを必要とする他の条件に基づいて必要に応じて開始/停止するのが最適だと思われます実行されている(または実行されていない)。

そうしないと、これをプロセスとして実行しようとすると、PIDなどをキャプチャする必要があるため、必要なときに起動したデーモンをシャットダウンすることができます。initconfigファイルをインストールするのと同じくらい複雑ですまた、Upstartなどのシステムが開始/停止などの制御を提供するという利点はありません。

5
PhillipHolmes

特に出力をログに記録したかったため、最善の方法を見つけたのは、「デーモン化」パッケージを使用することでした。以下のようなCentOS/Redhatを使用している場合。おそらく、そのためのaptパッケージもあります。

- name: yum install daemonize
  yum:
    name: daemonize
    state: latest

- name: run in background, log errors and standout to file
  Shell:  daemonize -e /var/log/myprocess.log -o /var/log/myprocess.log  /opt/myscripts/myprocess.sh
2
nelsonenzo

上記のdaemonizeの提案に追加します。特定のディレクトリでプログラムを開始する場合は、次のようにします。

- name: install daemonize package
  package:
    name: daemonize
    state: latest
- name: start program
  command: daemonize -c /folder/to/run/in /path/to/myexeprogram arg1 arg2

特に、-e -oフラグを使用して出力をログに記録することもできます。

0
Kritonas