「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_VARIABLE
0で始まる行を確認してください。
答え2
while
bashのループを使用して出力をテストします。そして経過時間:
#!/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
timeout
20分が経過すると、コマンドはゼロ以外の終了状態で終了します。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