Cronjobタイミング精度 - パラメータで予約された時間

Cronjobタイミング精度 - パラメータで予約された時間

クローンのタイミングがどれほど正確で決定的なのかを知りたいです。 11:00:00に実行中のcronjobがあり、そのcronジョブにパラメータとして時間を渡すとします。どのような場合でも、パラメータの時間が異なる場合があります(例:11:00:01)。執行が正確な時間に行われると100%確信できますか?サーバーの過負荷や予期しない状況などの問題が心配です。影響を与える可能性がありますか?できると思います。

また、実際の時間ではなく、スケジュールされた実行時間をパラメータとして渡す方法も知りたいです。実際の実行は11:00:01のように後であると仮定します。 cronjobで定義された予約時間(例:11:00:00)とcronジョブが10分ごとに実行されるように設定されている場合は、どうすればよいですか?この場合、スクリプトが実行されるたびにパラメータとして提供されるようにスケジュールされた時間を取得できますか?

10 * * * * /tmp/script.sh $(date)

ベストアンサー1

私のシステムログを見ると、cronジョブは通常1分1秒で始まることがわかります(Ubuntu 20.04)。 (例:501はでトリガーされます05:10:01。)私のシステムでは非常に安定していますが、保証することはできません。

過負荷状態では、cronjobがタイムリーに実行されても状況が悪化する可能性があります。極度に負荷がひどい場合は遅れる可能性があります破棄1秒以上。しかし、このような過度の負荷のため、起動時間が無意味になるほどスクリプトが遅くなります。

Cronは時々作業をスキップしてスキップすることがあります。たとえば、システムがダウンした場合、決して追いつくことはできません。このコメントに特に注意してください。手動:

これは、存在しない時間(たとえば、夏時間の切り替え中に「欠落している時間」など)が一致せず、「欠落している時間」の間にスケジュールされたジョブが実行されないことを意味します。同様に、夏時間の切り替え中に複数回発生した場合、一致操作は2回実行されます。

05:10:01 が 05:10:02 で実行されたときにコードが中断されないことを確認してください。


どのタスクが実行されているかを知らせるcronを取得するためのエレガントな方法はありません。異なる時間に実行するように複数の同じタスクを設定でき、各タスクは時間をパラメータとして渡します。 2つのオプションがあります。

アイテムの多いcrontabの設定

下記のコメントをご確認ください。

はい、1日は1440分なので、その分の間にcrontabを実行する必要がある場合は、crontabを生成するスクリプトが必要になる場合があります。

#!/bin/bash

for hour in {0..23} ; do
  for minute in {0..59} ; do
    echo "${minute} ${hour} * * *   root    /path/to/script.sh ${hour}:${minute}:01"
  done
done > /etc/cron.d/my-job

あなたは次のように終わります:

01 00 * * *   root    my-job 00:01:01
02 00 * * *   root    my-job 00:02:01
03 00 * * *   root    my-job 00:03:01
...

最も近い予測実行を見つけるためのラッパースクリプトの作成

現在時刻を確認し、最新のエントリを検索するラッパースクリプトを作成する方が良いでしょう。ジョブが15分ごとに実行されるように設定されている場合は、次のものを使用できます。ここで提供される例:

#!/bin/bash
curdate=`date "+%s"`
run_time=$(($curdate - ($curdate % (15 * 60))))
run_time_arg=$(date -d"@$run_time" "+%H:%M:%S")
/path/to/script.sh $run_time_arg

これはGNU固有の動作を使用し、dateすべての実装で機能するわけではありません。

おすすめ記事