回答:
crontabのコマンドが実行される/bin/sh
ので、算術展開を使用して、25を法とする現在の分がゼロに等しいかどうかを計算できます。
*/5 * * * * [ $(( $(date +\%s) / 60 \% 25 )) -eq 0 ] && your_command
cron
このエントリ全体を5分ごとに実行しますが、25を法とする現在の分(エポックからの分単位)がゼロに等しい場合のみ実行されますyour_command
。
他の人が指摘したように、1日は25分で割り切れないため、これはyour_command
毎日同じ時間に実行されることはありませんが、25分ごとに実行されます。
あなたの最善の策は、20分または30分で実行することです。
次に最適なのは、5分ごとにトリガーし、内部カウントまたはタイムスタンプを保持して、5回ごとにトリガーを実行するか、最後の実行から25分が経過した場合です。
より複雑なのは、真夜中に開始する1日の正しい時刻を算出し、その日の終わりにエラーを受け入れることです。これには、crontabエントリを異なる時間に複製する必要があります。
それよりも複雑なのは、1か月全体の時間を計算することです。これには、さまざまな組み合わせに対応するためにcrontabエントリのコピーが多数含まれます。
最後に、独自のAlways Onデーモンを実装して、スケジューリングを実行させることができます。
私はそれを直接経験していませんが、fcronはあなたが箱から出して欲しいことをするようです。そのドキュメントによると、周波数を指定できます:
# Get our mails every 30 minutes
@ 30 getmails -all
# make some security tests every 48 hours of system up time,
# force a mail to be sent to root even if there is no output
@mailto(root),forcemail 2d /etc/security/msec/cron-sh/security.sh
@ 25 command
して、トリックを行う必要があります。
ここで何が問題なのか簡単に説明させてください。分フィールドに25を入力cron
すると、現在の時間の分が25に等しいとき、つまり1時間に1回実行されます。一致のリストを入力できますが、問題は60(1時間の分)が25で割り切れないため、時間に基づいていくつかのエントリを追加する必要があることです。60と25の最小公倍数は300、つまり5 * 60です。そのため、元のスタートに戻るまで5時間サイクルする必要があります。例えば:
0、25、50
15、40
5、30、55
20、45
10、35
...
しかし、ここでも、24(1日の時間)は5で割り切れません。5と24の最小公倍数は、単純に5 * 24 = 120です。
ファイルの最終変更時間で遊ぶことができます
/usr/local/bin/age
ファイルの経過時間を出力する小さなスクリプト(たとえば)を作成します。
#bin/sh
echo $(( $( date +%s ) - $( stat -c %Z $1 ) ))
crontabは次のようになります(私が正しい場合、25分が1500秒に等しいと仮定します)。
* * * * * [ $(/usr/local/bin/fileage /var/tmp/your_command.offset) -gt 1500 ] && touch /var/tmp/your_command.offset && your_command
FHSによれば、システムのシャットダウン/起動時に削除されることになっていないため、/var/tmp
代わりに使用していることに注意してください。/tmp