はじめに
Jenkinsのジョブから、nohupコマンド等でジョブが終了しても生き残るようなプロセスを作りたくなる場面があるかと思います。(例えば特定のプログラムを監視する目的でサーバー上に常駐させたい場合など。)
業務の中で上記のようなケースで若干ハマってしまったため、備忘として残しておきます。
前提として、Jenkinsの中のProcess Tree Killerについて説明します。
Process Tree Killerについて
Jenkinsにはビルドの中で生成されたプロセスを列挙、削除するような機構としてProcess Tree Killerが存在します。
Jenkinsのジョブの中で生成されたプロセスは、ジョブの終了と同時に殺されてしまいます。
デフォルトでは有効に設定されているのですが、もし無効にしたい場合には以下のように起動時オプションとして hudson.util.ProcessTree.disable
にtrueを渡してやることで実現可能です。
$ java -Dhudson.util.ProcessTree.disable=true -jar jenkins.war
詳細な説明は以下に譲ります。
ProcessTreeKiller - Jenkins - Jenkins Wiki
個々のビルドの中でProcess Tree Killerを無効にしたい
Process Tree Killerは不要なプロセスを削除する上で役に立つので、デフォルトで無効にすることは憚られるかと思います。
以下のように環境変数 BUILD_ID
に dontKillMe
を渡してやることで、その環境変数が有効になっている限り一時的にProcess Tree Killerを無効にすることが出来ます。
$ BUILD_ID=dontKillMe nohup ping localhost &
因みにJenkins Jobの中で実行する場合には上記のようなやり方で実現できますが、Pipelineでの実行時は BUILD_ID
の代わりに JENKINS_NODE_COOKIE
を指定する必要があります。
$ JENKINS_NODE_COOKIE=dontKillMe nohup ping localhost &