Jenkinsジョブをセットアップしてシェルスクリプトのタイムアウトに関する問題を発見しました。シェルスクリプトのタイムアウトを設定し、時間が終了して終了する(0)ようにする
それはこのように動作します:
スタートジェンキンス→control.sh
が起動される→test1.sh
control.sh
のcontrol.sh
パートコードに発売されたことのようである:func.shの
#!/bin/sh
source func.sh
export TIMEOUT=30
# set timeout as 30s for test1.sh
((sleep $TIMEOUT && function_Timeout) & ./test1.sh)
# this line of code is in a = loop actually
# it will launch test2.sh, test3.sh... one by one
# later, I want to set 30s time out for each of them.
function_Timeout() {
if [ ! -f test1_result_file]: then
killall test1.sh
# the test1_result_file will not
# be created if test1.sh is not finished executing.
fi
}
一部としてあります以下
#!/bin/sh
function trap_fun() {
TRAP_CODE=$?
{ if [ $TRAP_CODE -ne 0 ]; then
echo "test aborted"
else
echo "test completed"
} 2>/dev/null
trap "trap_fun" EXIT
control.sh
がJenkinsジョブによって起動された後、control.sh
は、時間が終了してkillall test1.sh
の行に達したときに終了し、Jenkinsジョブは停止して失敗します。
私はtest1.sh
が殺され、終了コードが0
ないので、それはこの問題を引き起こしているからだと思います。
私の質問は、サブスクリプト(私の場合はcontrol.sh
のように、メインスクリプトによって起動された)を終了または終了させるための方法ですか?コード0
で終了しますか?
は、7月1日更新:答えを
おかげで今のところ、私はレオンの提案@しようとしたが、私は、タイムアウトの強制終了アクションによって送信されたコード124は、まだトラップコードでキャッチされた - トラップ「trap_fun」 EXITはfunc.shにあります。
詳細を追加しました。私はたくさんのGoogleの仕事をしたが、まだこの問題を解決する適切な方法を発見していない:(あなたの親切な助けのため
おかげ
@ 123返信いただきありがとうございます! test1.shでそれをトラップする方法を指定できますか?申し訳ありませんが、シェルには初めてです –
- なぜサブシェルを使用していますか? - 'f_Timeout'とは何ですか?私はあなたのサンプルコードで定義された 'function_Timeout'を見るだけです。 –
@Fara私のタイプミスに申し訳ありません:( –