web-dev-qa-db-ja.com

cronスケジュールを時間間隔に変換する

サーバー上にユーザーが定義した多くのジョブがあり、それらのジョブの一部はcron式を使用してスケジュールされています。これらのジョブがスケジュールよりも長くかかっているかどうかを確認する必要があります(サーバーでGroovy/Javaを実行できます)(つまり、ジョブは10分かかりますが、5分ごとに実行するようにスケジュールされています)。

私は、cron式を時間間隔に変換するものを見つけようとしています。 これ は、cron式を人間が読める文字列に変換するのに非常に優れているようですが、最短の時間間隔を取得する方法はどうでしょうか?

年から秒に再帰的にループし、見つかった時間をリストに追加し、各時間間隔を計算し、そこから最小のものを見つける解決策はありますか?またはより良い方法はありますか?

例として、cron式があるとします:0 0 11,16,19,21 * * *これは、毎年、毎月11:00、16:00、19:00、21:00に変換されます。これにより、5h、3h、2h、14hの間隔が得られます。最短の間隔-2時間に興味があります。

これはすぐに非常に複雑になり、膨大な間隔になる可能性があることは理解していますが、計算する必要がある式をランダムに調べていたため、かなり簡単でした。ここで答えを待っている間に、私は Quartz ライブラリーを発見しました。私はそれにcron式を与え、単に「次はいつ、次はいつか」などと尋ねることができます。だから私が尋ねるなら.. 5回言うなら、私はおそらく私のケースのほとんどをカバーしています。私はそれがどのように機能するかを確認する必要があります。誰かがより良い解決策を持っているなら、私はそれを温かく歓迎します。

4
Erki M.

同じタスクで複数のcrontabエントリを検討する必要がある場合は、完全な400年のグレゴリオサイクルを繰り返す必要があります。例えば:

59 23 29 2 * me /home/me/mytask # 11:59 Feb 29
01 00  1 3 * me /home/me/mytask # 00:01 Mar 1

これらのイベントは、うるう年ごとに2分間隔で発生します

さらに悪い:

59 23 29 2 * me /home/me/mytask # 11:59 Feb 29
01 00  * * 0 me /home/me/mytask # 00:01 Sunday

これらのイベントは、2月29日が土曜日になる2分間隔で発生します。

Cronデーモンが現地時間を使用するシステムのもう1つの難しいケース:

0 1,3 * * * me /home/me/mytask # 01:00 and 03:00

これらのジョブは、DSTが始まる朝を除いて、2時間離れて実行されます。その朝、彼らは1時間離れて走ります。

2
kevin cline