GNU/Linux >> Linux の 問題 >  >> Linux

Crontab では、n > 60 の n 分ごとに指定する一般的な方法

タイミングを達成するために必要なジョブを自分で計算する必要があります。

0 0-23/7 * * * whatever
30 3-23/7 * * * whatever

以下の 2 つの例から簡単なアルゴリズムを導き出すことができます (30 分のオフセットがある場合):

  • 2 つのエントリを追加します。1 つは 0 分のオフセット、もう 1 つは 30 分のオフセットです。
  • duration * 2 に等しい時間範囲の幅を指定します .
  • 時間のオフセットを指定します。1 つは 0 から始まり、もう 1 つは 30 分の部分を破棄した後の期間から始まります。

もっと考えれば、75 分ごとなど、同様の解決策を思い付くことができます。

編集:

Cron は、すべてのタイプのスケジュールされたジョブに使用できるわけではありません。たとえば、毎月 1 回、月末にジョブを実行します。月の最終日は月ごとに変わるため、単純に cron で実行することはできません。これを解決するには、月の最終日 (28 ~ 31) の可能な範囲の値で cron ジョブを実行し、実際のジョブを実行する前に、実際に最終日であるかどうかをスクリプトで確認します。


コマンドの結果を入れます

date +%s

crontab の変数に。 TIME=1497950105 のようなもの。 crontab に次のようなエントリが必要です

* * * * * /bin/bash -c '[[ $(($(date +\%s)-TIME)) -gt seconds ]] && TIME=$(date +\%s) && whatever'

seconds は、必要な秒数です (この場合は 12600 )。

または、プログラム終了後3時間30分待ちたい場合

* * * * * /bin/bash -c '[[ $(($(date +\%s)-TIME)) -gt seconds ]] && whatever && TIME=$(date +\%s)'

編集: 以前の回答を修正しました:

  • % 記号を \ でエスケープする必要があるため、%s \%s になります
  • コマンドの前に /bin/bash -c を付ける必要があります

別の解決策 (TIME を使用しない) は次のとおりです。

 * * * * * /bin/bash -c '[[ $((($(date +\%s) / 60) % minutes)) -eq 0 ]] && whatever'

あなたの場合、分は 210 です。

編集 2:

MSalters によって提案されているように、N 分ごとにエントリを実行することをお勧めします。ここで、N は 60 と分単位の時間間隔の間の最大公約数です


この場合、単に cron を使用して、それ自体では実行できないことを実行しようとしているだけだと思います (もちろん、cron が実際にヘルパー スクリプトを定期的に実行するソリューションは除きます。この場合、それは cron ではないと主張します)。それ自体が問題を解決します)。

3 時間 30 分間隔の解は完全には正しくありません。これが与えられた解決策でした:

0 0-23/7 * * * whatever
30 3-23/7 * * * whatever

これが間違っている理由は、cron が 21:00 と 00:00 の時刻にジョブを実行するためです。これは、3 時間 30 分ではなく 3 時間の間隔です。

すべての時間間隔の一般的な解決策は、24 時間に均等に分割されないケースを処理できる必要があります。 24 時間に均等に分割されるわけではありませんが、1 週間に均等に分割されます。これを考える最も簡単な方法は、次のように「7 時間ごと」の 2 つの重複セットを行うことです。

0 0-23/7 * * 1 whatever
0 4-23/7 * * 2 whatever
0 1-23/7 * * 3 whatever
0 5-23/7 * * 4 whatever
0 2-23/7 * * 5 whatever
0 6-23/7 * * 6 whatever
0 3-23/7 * * 7 whatever
30 3-23/7 * * 1 whatever
30 0-23/7 * * 2 whatever
30 4-23/7 * * 3 whatever
30 1-23/7 * * 4 whatever
30 5-23/7 * * 5 whatever
30 2-23/7 * * 6 whatever
30 6-23/7 * * 7 whatever

月は週と完全に一致しないため、週で割り切れる何かを行うことが最善の方法です。それが実行可能な唯一の方法です。たとえば、正確に 12 分ごとの間隔は crontab の 1 行では些細なことですが、10080 は 11 で割り切れないため、正確に 11 分ごとの間隔は不可能です (10080 は 1 週間の分数です)。 /P>

これが可能なケースを解決するアルゴリズムを書くことは間違いなく可能ですが、特に解決策が実際にどのようになるかを考えると、明らかにあまり価値がありません.


Linux
  1. 15分ごとに「xribfa4」を実行している疑わしいcrontabエントリ?

  2. ユーザーが crontab を編集できない、エラー:「/tmp/crontab.Lm34gsJV:権限が拒否されました」

  3. 特定の時間の間、15分ごとに実行されるcrontab

  1. cron / crontabログはどこにありますか? / cronログを有効にする方法は?

  2. ファイルをインプレースで変更する方法は?

  3. Linux で細かいことごとに「sudo」を書かなくて済むようにする方法はありますか?

  1. Linuxで元に戻すことはできますか?

  2. パイプラインのセクションを完全に「パススルー」するように指定する方法は?

  3. root 以外のユーザーが crontab エントリを作成できないようにする方法