以下のコードを使用して5時間ごとにクローンジョブを設定できますか?
0 */5 * * * script.sh
私のscript.shはいつ実行されますか?
- 0000、0500、1000、1500、2000、0100、0600、1100、1600、2100など...
または
- 0000、0500、1000、1500、2000、0000、0500、1000、1500、2000など...
この伝統的なアプローチでは、5時間ごとにクローンタスクを設定できない場合は、そのようなタスクを設定する他の方法はありますか?
答え1
クローン操作は次のように指定されます。
0 */5 * * * script.sh
2番目のオプションでは、ジョブは20:00から00:00までの4時間間隔で実行されます。
試してみることができる5つの職業仕様があります。
0 0-20/5 1-31/5 * * script.sh
0 1-21/5 2-31/5 * * script.sh
0 2-22/5 3-31/5 * * script.sh
0 3-23/5 4-31/5 * * script.sh
0 4-19/5 5-31/5 * * script.sh
3番目のフィールドはその月の日付です。これにより、ジョブは5日間の倍数で毎月5時間ごとに完全に実行されます。他の月には、その月の最後のジョブ実行と新しい月の最初の実行との間の遅延が短すぎるという同じ問題があります。
大丈夫かもしれません。それ以外の場合は、5時間の遅延を含む無限ループでバックグラウンドジョブとしてジョブを実行することを検討できます。
#!/bin/sh
while true; do
script.sh &
sleep 18000 # 5h
done
上記はバックグラウンドで実行される制御スクリプトです。
多くの反復の後、明らかにわずかなドリフトが始まり、正確に時間通りに始めるのが難しいかもしれません。
別のアイデアは、次のようにスクリプト自体を再スケジュールすることですat
。
#!/bin/sh
echo script.sh | at now + 5 hours
# rest of script goes here.
答え2
もう1つのアプローチは、cronに1時間ごとにスクリプトを実行させ、実際の作業は5時間ごとに実行することです。あるいは、より簡単には、最後の実行から少なくとも5時間が経過した場合にのみ可能です。ファイルをタイムスタンプとして使用する小さなスクリプトを作成できます。
GNUシステムでは、次のスクリプトが機能します。
#/bin/bash
timestamp=/tmp/timestamp
interval=5*60*60 # 5 hours
if [[ ! -f /tmp/timestamp ]]; then
touch "$timestamp"
exit 0 # recreate timestamp and do work
fi
if [[ $(( $(date +%s) - $(date -r "$timestamp" +%s) )) -lt $interval ]]; then
exit 1 # don't do work
fi
touch "$timestamp" # update timestamp and do work
exit 0
(date -r
GNUなのに、FreeBSDではお使いいただけると思いますstat +%m "$timestamp"
。)
次のcrontabラインを使用して実行します。
0 * * * * /foo/every5h.sh && /foo/do_the_actual_job.sh
これは問題を引き起こす可能性があります。スクリプトの実行が遅れると、タイムスタンプが1時間後に数秒後に更新される可能性があります。interval=5*60*60-15
以前の実行後04:59:45に新しい実行が開始されるようにスクリプトで時間間隔を設定することで、この問題を解決できます。スクリプト自体は1時間に1回だけ開始されるため、作業時間は変わりません。
システムに障害が発生して5時間以上経過した場合は、次の1時間操作が続行されます。そして、上で書いた方法のようにタイムスタンプファイルが削除されると、再生成されます。そしてこれは次の時間内に行われます。
少なくとも次のような答えがあります。
答え3
5時間ごとに設定すると5時間ごとなので、0、5、10、15、20、1、6など... (*/5構文)
0 5 10 15 20 0 5 10などに設定する必要がある場合...明示的に指定する必要があります。
0 5,10,15,20,0 * * * somejob