
毎日クローン作業を開始する必要がありますが、毎日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
合成:
job.service
というファイルを作成します/etc/systemd/system/
。- 必要な情報を入力してください。を使用して設定を確認できます
systemctl status job.service
。 job.timer
というファイルを作成します/etc/systemd/system/
。必要な情報を入力してください:
[Unit] Description=daily + 1 hour task [Timer] OnUnitActiveSec=25h # run 25 hours after service was last started AccuracySec=10min [Install] WantedBy=timers.target
- 確認タイマーの使用
systemctl list-timers
- 完璧。
答え3
cronjob以外のものを使用しても問題ない場合は、あまり知られていないユーティリティを使用することをお勧めしますat
。ラッパースクリプトを作成し、25時間以内に実行するようにスケジュールし、プログラムを呼び出すだけです。これが最もクリーンな解決策のようです。
たとえば、 ~/script.sh に次のように書くことができます。
echo "bash ~/script.sh" | at now + 25 hours
/usr/bin/yourprogram
それでは一度だけ実行してみてくださいbash ~/script.sh
。
25時間ごとに作業スケジュールを計画するアイデアをいただいた@HalosGhostに感謝します。