特定の時間に一度だけスクリプトを実行する必要があります。
方程式: - 初めてスクリプトが9時30分に実行されますが、誰かが930と945の間で自分のスクリプトを再実行しようとした場合(手動でまたは940の操作で)、実行しないでください。
if [ (${date} -gt "0930" && ${date} -lt "0945") or (${date} -gt "1130" && ${date} -lt "1145") ]
then
write_log "Fetching data"
while read line
do
"does processing"
done < ${CONFIG_FILE}
else
write_log "Its not time to fetch details."
fi
答え1
最後の実行日をファイルに保存できます。
date +"%s" > last_file
last_file
ファイル名は次のとおりです。たとえば、これはエポックの開始後の秒数を記録します。 1549605438. これがあれば読むことができます:
read last < last_file
これはlast
シェル変数名です。これを得たら、比較する算術が必要です。
threshold=900 # 60 * 15 = 15 minutes
[ "$(date +'%s')" -gt "$((last + threshold))" ] || exit
現在の2番目のカウントを最後のカウントに設定されている一時停止間隔を加算した値と比較します。時間が足りない場合は終了してください。それ以外の場合は、続行 - 残りのスクリプトを実行します。
最後に、両方のインスタンスが同じ方法で起動するのを防ぐには、いくつかのセマフォが必要です。プロセス2は、プロセス1が最後の実行日を確認し、それ自身の日付を書き込む前に開始される。
全体のアルゴリズムは次のとおりです。
- セマフォを設定します。
- 最後の実行時間を読みます。
- 承認されたら、独自のランタイムを作成してください。 (正しく作成した後は後で可能です。)
- このスクリプトに関連するタスクを実行します。
- セマフォを解放します。
スクリプトを初めて実行するまでは、last_file
手動でスクリプトを挿入しない限り存在しないことに注意してください。したがって、そこに置くか、適切なロジックを使用してスクリプトを免疫するようにします。
答え2
スクリプトの最後に、これを使用して現在date +%s
時刻(1970年1月1日以降の秒単位)を取得し、外部ファイルに記録して既存のコンテンツを上書きできます。
スクリプトの先頭からファイルの値を読み、現在時刻を取得し(再度date +%s
)、別の時間から1つを減算し、その違いを使用して何をするかを決定できます。
(大きな写真です。明らかにファイルが見つからない、数値以外の値を読み取る、ファイル権限、競合状態などの問題を処理する必要がありますが、これは詳細です。)