スクリプトは、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で始まる行を確認してください。

答え2

whilebashのループを使用して出力をテストします。そして経過時間:

#!/bin/bash
patience=$((20 * 60))
while ! autorep -g GLOBAL_VARIABLE | grep -q " 0 "  && (( SECONDS < patience ))
do
  sleep $((2 * 60))
done
if (( SECONDS >= patience ))
then
  exit 1
else
  sendevent -E SET_GLOBAL -G "YES"
fi

autorepこれは、コマンドが" 0 "ラインをエクスポートするか、経過時間が忍耐変数を超えるまで繰り返されます。これ超変数bashは、シェルが開始されてからの秒数に設定されます。ここでは、新しいシェルがこのスクリプトを実行するので、タイマーのように動作します。ループが終わったら、時間が経過したことを確認してください。その場合は、exit 1必要に応じてコマンドを実行してくださいsendevent

関連期間についてできるだけ明確な画像を提供するために、忍耐変数とsleepコマンドのタイムスタンプを明示的に拡張しました。元の質問には、「スリープ2」(2秒)と「スリープ2分」が衝突します。上記のコードはテスト間の2分間スリープ状態です。

答え3

GNUtimeoutコマンドを使用して20分間記録します。

if timeout 20m sh -c '
    until autorep -g GLOBAL_VARIABLE | grep -qF " 0 "; do
        sleep 120
    done'
then
    echo 'did not time out'
else
    echo 'timed out'
fi

timeout20分が経過すると、コマンドはゼロ以外の終了状態で終了します。grep探している文字列が見つかると、終了ステータスがゼロの状態で終了します。

パラメータ化された睡眠時間:

long_sleep=20   # minutes
short_sleep=120 # seconds

if timeout "${long_sleep}m" sh -c '
    short_sleep=$1; shift
    until autorep -g GLOBAL_VARIABLE | grep -qF " 0 "; do
        sleep "$short_sleep"
    done' sh "$short_sleep"
then
    echo 'did not time out'
else
    echo 'timed out'
fi

関連情報