スクリプトは、Y分の間、X分ごとに「if」ステートメントを繰り返し、これがtrueでなければ失敗します。

スクリプトは、Y分の間、X分ごとに「if」ステートメントを繰り返し、これがtrueでなければ失敗します。

「autorep」および「sendevent」コマンドはAutosysにのみ適用されますが、私が実行する必要があるスクリプトは次のとおりです。

if autorep -g GLOBAL_VARIABLE |grep " 0 " >/dev/null
 then 
  sendevent -E SET_GLOBAL -G "YES"

 else
  sleep 2
fi

GLOBAL_VARIABLE = 0 または 20 分までの間にこのスクリプトを繰り返すにはどうすればよいですか。

forループを考えていますが、いくつかのガイドラインが必要です。

autorepコマンドの出力:

Global Name                                                      Value                                                                                                Last Changed
________________________________________________________________ ____________________________________________________________________________________________________ ____________________
GLOBAL_VARIABLE                                                        Y                                                                                                    12/15/2020 00:00:01

GLOBAL_VARIABLE値がゼロでない場合は、2分間待機してから再試行するスクリプトが必要です。 20分終了時点の値が0でない場合、スクリプトは1で終了する必要があります。

ベストアンサー1

これをループでラップし、whileコマンドが動作しているかどうかをテストするだけでなく、繰り返し回数または経過時間テストも追加します。テスト中のコマンドが正しいと仮定すると、Bashまたは標準シェルで動作します。

#!/bin/sh
elapsed=0
delay=2
timeout=$(( 20 * 60 ))
success=0
while true; do
    if autorep -g GLOBAL_VARIABLE |grep " 0 " >/dev/null; then
        success=1
        break
    fi
    if [ "$elapsed" -ge "$timeout" ]; then
        break
    fi 
    sleep "$delay"
    elapsed=$(( elapsed + delay ))
done
if [ "$success" = 1 ]; then
    echo "the command succeeded after waiting "$elapsed" seconds"
else
    echo "the command never succeeded within '$elapsed' seconds"
fi

delay単位timeoutは秒なので、20 * 60 = 1200秒は20分です。

睡眠時間だけを考慮したものなので、autorep完了するのに時間がかかる場合はオフになります。 Bashでは、これを使用して$SECONDSスクリプトが開始されてからの時間を取得できます。

また、コマンドの出力には正しい位置でない限り、スペースで囲まれたスペースを含めることはできません0

... | grep -q "^GLOBAL_VARIABLE[[:space:]]*0 " 

GLOBAL_VARIABLE0で始まる行を確認してください。

おすすめ記事