Jenkinsからスクリプトを起動し、ビルドをハングさせず、プロセスを実行したままにする適切な方法は何ですか?私はそれを動作させることができないようです。スクリプトが実行されないか、ビルドがハングします。
ビルドの「シェルの実行」ステップbash relaunch.sh &
またはrelaunch.sh > output.log &
またはNohup bash relaunch.sh &
を配置しても、何も起こりません。ビルドは終了しますが、プロセスは実行されません。ジェンキンスが エラーパイプを閉じる を待っていることに関連していると思います。
here のようにNohup bash relaunch.sh 2>&1 > output.log
を実行すると、出力は適切にリダイレクトされますが、ビルドがハング(終了しない)し、ビルドを強制終了するとプロセスが停止します。
提案されたexport BUILD_ID=dontKillMe
の追加 here 、 here 、および here 、「シェルの実行」ステップまたはスクリプト自体のいずれかどちらも助けません。ビルドを停止すると、ビルドがハングし、プロセスが停止します。言うまでもなく、Linuxに関する私の知識は非常に限られています。
人々はどのようにしてこれをきれいに行うのでしょうか?
これを実現する便利な方法は、環境変数BUILD_ID
をの下で変更することです。実行シェルJenkins's
ProcessTreeKiller を探しています。
することにより、
BUILD_ID=dontKillMe Nohup bash relaunch.sh &
Jenkinsは、バックグラウンドジョブがビルドによって生成されないと想定し、ジョブの終了後にそれらを強制終了しません。
Joshua のおかげで、JENKINS_NODE_COOKIE
も
JENKINS_NODE_COOKIE=dontKillMe
私はまったく同じ問題を抱えていました。 Jenkins execute Shellボックスに以下を配置することでこれを修正しました。
BUILD_ID=dontKillMe ./grid.sh
&
スクリプトファイル内。スクリプトは次のようになります。
#!/bin/bash
Java -jar Selenium-server-standalone-3.0.1.jar -role hub &
これが誰かの助けになることを願っています!
興味深いソリューション。誰かがスクリーンを試しましたか?
実行方法は次のとおりです(ModelSim-ASEを使用したRTLシミュレーションの場合)。
screen -S $testname -d -m -L bash -c 'cd build_sim ; make; make sim'
echo Waiting for simulator ...
次に、screenlog.0を見て、シミュレーターが待機状態になるのを待ちます。
until ((`fgrep -c 'Ready for simulation' screenlog.0`)) ;do
sleep 1
done
次に、シミュレーションを必要とする他のジョブの実行が完了すると(またはJenkinsが失敗を検出すると)、ポストで次を実行します。
screen -S $testname -X kill
唯一の注意点は、ジョブがクリーンアップされる前にJenkinsが何らかの理由で死亡した場合、理論的には、何かが起こるのを待っている間にシミュレーターがリソースを噛み砕くことができるということです。
少し分解するには:画面では、「-S」はセッションにタイトルを割り当てます(またはそのタイトルで実行中のセッションをアドレス指定します)、「-d」は切り離されて実行され、「-m」は最初にフォークを生成します( Jenkins用心深い目)、および-Lはロギングをオンにします(これは、シミュレーターで何かが壊れた場合にも便利です-出力にログファイルアーティファクトがあります)。残りは、スクリーンセッション内の単純なbashです。