Kubernetesジョブが完了するのを待つ最良の方法は何ですか?私は使用するための多くの提案に気づきました:
kubectl wait --for=condition=complete job/myjob
しかし、私はそれが仕事が成功した場合にのみ機能すると思います。それが失敗した場合、私は次のようなことをしなければなりません:
kubectl wait --for=condition=failure job/myjob
待機を使用して両方の条件を待機する方法はありますか?そうでない場合、ジョブが成功または失敗するのを待つ最良の方法は何ですか?
最初の待機条件をサブプロセスとして実行し、そのPIDを取得します。条件が満たされると、このプロセスは終了コード0で終了します。
kubectl wait --for=condition=complete job/myjob &
completion_pid=$!
障害待ち状態についても同様にしてください。ここでのトリックは、&& exit 1
を追加して、ジョブが失敗したときにサブプロセスがゼロ以外の終了コードを返すようにすることです。
kubectl wait --for=condition=failure job/myjob && exit 1 &
failure_pid=$!
次に、Bash組み込み関数wait -n $PID1 $PID2
を使用して、条件の1つが成功するのを待ちます。このコマンドは、最初に終了するプロセスの終了コードをキャプチャします。
wait -n $completion_pid $failure_pid
最後に、wait -n
の実際の終了コードをチェックして、ジョブが失敗したかどうかを確認できます。
exit_code=$?
if (( $exit_code == 0 )); then
echo "Job completed"
else
echo "Job failed with exit code ${exit_code}, exiting..."
fi
exit $exit_code
完全な例:
# wait for completion as background process - capture PID
kubectl wait --for=condition=complete job/myjob &
completion_pid=$!
# wait for failure as background process - capture PID
kubectl wait --for=condition=failure job/myjob && exit 1 &
failure_pid=$!
# capture exit code of the first subprocess to exit
wait -n $completion_pid $failure_pid
# store exit code in variable
exit_code=$?
if (( $exit_code == 0 )); then
echo "Job completed"
else
echo "Job failed with exit code ${exit_code}, exiting..."
fi
exit $exit_code