将第一个等待条件作为子进程运行并捕获其 PID。如果满足条件,该进程将退出,退出代码为 0。
kubectl wait --for=condition=complete job/myjob &
completion_pid=$!
对失败等待条件执行相同的操作。这里的技巧是添加&& exit 1
以便子进程在作业失败时返回非零退出代码。
kubectl wait --for=condition=failed job/myjob && exit 1 &
failure_pid=$!
然后使用 Bash 内置wait -n $PID1 $PID2
等待其中一个条件成功。该命令将捕获第一个退出进程的退出代码:
MAC 用户!注意wait -n [...PID]
需要 Bash 版本 4.3 或更高版本。由于许可证问题,MacOS 永远停留在 3.2 版本。请看这个Stackoverflow 帖子 https://stackoverflow.com/a/11704224/3745474关于如何安装最新版本。
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=failed 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