毎日1時間ずつcronjobを起動する方法は?

毎日1時間ずつcronjobを起動する方法は?

毎日クローン作業を開始する必要がありますが、毎日1時間ずつ遅く開始する必要があります。今年の日を除いて、今まで私が持っていたもののほとんどはうまくいきます。

0 0 * * * sleep $((3600 * (10#$(date +\%j) \% 24))) && /usr/local/bin/myprog

日付が365の場合は5時に作業が始まりますが、翌日(うるう年を除く)にはその年の日付が1になるため、1時に作業が始まります。この極端な状況からどのように外れますか?

答え1

私が好む解決策は毎時間作業を始めますが、スクリプト自体で実行する時間であることを確認してから、25回のうち24回は何もせずに終了することです。

予約されたもの:

0 * * * *    /usr/local/bin/myprog

myprog:

[ 0 -eq $(( $(date +%s) / 3600 % 25 )) ] || exit 0

スクリプト自体を変更したくない場合は、「実行時間」チェックをcrontabエントリに入れることもできますが、これを行うと長くて見苦しい行が表示されます。

0 * * * *    [ 0 -eq $(( $(date +\%s) / 3600 \% 25 )) ] && /usr/local/bin/myprog

答え2

システムがシステム化されている場合は、これにタイマーイベントを使用できます。ただ定義してください新しいサービス実行するコマンド/タスクを含める必要がある、OnUnitActiveSec次のオプションを使用してタイマーイベントを生成します。

[Unit]
Description=daily + 1 hour task

[Timer]
OnUnitActiveSec=25h # run 25 hours after service was last started
AccuracySec=10min

[Install]
WantedBy=timers.target

..service.timer

合成:

  1. job.serviceというファイルを作成します/etc/systemd/system/
  2. 必要な情報を入力してください。を使用して設定を確認できますsystemctl status job.service
  3. job.timerというファイルを作成します/etc/systemd/system/
  4. 必要な情報を入力してください:

    [Unit]
    Description=daily + 1 hour task
    
    [Timer]
    OnUnitActiveSec=25h # run 25 hours after service was last started
    AccuracySec=10min
    
    [Install]
    WantedBy=timers.target
    
  5. 確認タイマーの使用systemctl list-timers
  6. 完璧。

答え3

cronjob以外のものを使用しても問題ない場合は、あまり知られていないユーティリティを使用することをお勧めしますat。ラッパースクリプトを作成し、25時間以内に実行するようにスケジュールし、プログラムを呼び出すだけです。これが最もクリーンな解決策のようです。
たとえば、 ~/script.sh に次のように書くことができます。

echo "bash ~/script.sh" | at now + 25 hours
/usr/bin/yourprogram

それでは一度だけ実行してみてくださいbash ~/script.sh

25時間ごとに作業スケジュールを計画するアイデアをいただいた@HalosGhostに感謝します。

関連情報