雑に描いた餅

餅は餅屋、わたしは技術屋、と言いたかった。

Jenkinsでジョブが終了しても生き残るプロセスを作る

はじめに

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_IDdontKillMe を渡してやることで、その環境変数が有効になっている限り一時的にProcess Tree Killerを無効にすることが出来ます。

$ BUILD_ID=dontKillMe nohup ping localhost &

因みにJenkins Jobの中で実行する場合には上記のようなやり方で実現できますが、Pipelineでの実行時は BUILD_ID の代わりに JENKINS_NODE_COOKIE を指定する必要があります。

$ JENKINS_NODE_COOKIE=dontKillMe nohup ping localhost &