systemdタイマー→Cron式変換ツール

systemdタイマーのOnCalendar=構文をcron式(分 時 日 月 曜日)に変換する無料ツール。姉妹ツール「Cron式→systemdタイマー変換」の逆方向。名前付きショートカット(daily・weekly等)にも対応し、日と曜日を同時指定した場合の意味論の違いも警告表示します。

systemdコンポーネントとcronフィールドの対応表

systemdのOnCalendar=構文の各部分は、cron式の5つのフィールドでは以下のように対応します。

位置 systemdでの対応箇所 cronフィールド
1 時刻部分の分(HH:MM:SS の MM)
2 時刻部分の時(HH:MM:SS の HH)
3 日付部分の日(年-月-日 の 日) 日(日付)
4 日付部分の月(年-月-日 の 月)
5 曜日プレフィックス(例: Mon、Mon..Fri) 曜日

systemdの秒指定(HH:MM:SS の SS)はcronに対応するフィールドが無いため変換時に無視されます(「00」以外の秒が指定されている場合は警告を表示します)。

systemdの曜日略称とcronの曜日番号の対応表

systemdでは英語の曜日略称を使いますが、cronでは0〜6の数値で表します。

systemdの曜日略称 cronの曜日番号
Sun 0
Mon 1
Tue 2
Wed 3
Thu 4
Fri 5
Sat 6

systemdの名前付きショートカットとcron式の対応表

systemdには「daily」「weekly」のような読みやすい名前付きの特殊表記があり、本ツールはこれらもcron式に変換できます。

OnCalendar= cron式
minutely * * * * *
hourly 0 * * * *
daily / midnight 0 0 * * *
weekly 0 0 * * 1
monthly 0 0 1 * *
yearly / annually 0 0 1 1 *

よくある変換例

OnCalendar= cron式 意味
*-*-* *:*:00 * * * * * 毎分実行します(cronの「* * * * *」相当)。
*:00/15:00 */15 * * * * 15分ごとに実行します。
Mon..Fri 09:00:00 0 9 * * 1-5 平日(月〜金)の9時0分に実行します。
*-*-01 00:00:00 0 0 1 * * 毎月1日の0時0分に実行します。
*-01-01 00:00:00 0 0 1 1 * 毎年1月1日の0時0分に実行します。
Mon *-*-01 00:00:00 0 0 1 * 1 日(1日)と曜日(月曜日)の両方を指定した例。systemdではAND条件(両方を満たす日のみ実行)ですが、cronではOR条件(どちらか一方で実行)として解釈されるため、変換結果は元のOnCalendar式より実行頻度が多くなる点に注意してください。

日(日付)と曜日の両方を「*」以外に制限したOnCalendar式は、cron式では正確に変換できません(systemdはAND条件、cronはOR条件のため)。このようなケースでは変換結果の意味を必ず確認してください。

Tips

  • 「daily」「weekly」「monthly」のような名前付きショートカットもそのまま入力できます。内部的には対応するcron式(例: dailyは「0 0 * * *」)に変換されます。
  • 日(日付)と曜日の両方を「*」以外に指定すると、systemdのAND条件をcronのOR条件に変換する際に意味が変わります。この場合は警告を確認し、変換結果が意図通りか必ず確かめてください。
  • OnCalendar構文の年指定・秒指定はcronには存在しないフィールドのため、変換時に無視されます(警告で通知されます)。
  • Kubernetes CronJobへの移行など、systemdタイマーからcron形式のスケジュール記法に戻したい場面で活用できます。
  • 曜日と日付を同時に使わない単純なスケジュール(毎時・毎日・毎週など)であれば、この変換は常に正確に一致します。

よくある質問

systemdが使えない軽量なDockerコンテナへ移行する場合や、Kubernetes CronJob(cron形式のスケジュール記法を使う)で同じ定期実行を再現したい場合、あるいはチームの運用ツールがcron形式の設定しかサポートしていない場合などに、既存のsystemdタイマー設定をcron式に戻す必要が生じます。

はい。「minutely」「hourly」「daily」「weekly」「monthly」「yearly」といったsystemdの名前付きショートカットをそのまま入力すると、対応するcron式に変換されます。

systemdのOnCalendar構文では曜日指定と日付指定は常にAND条件(両方一致が必要)です。一方Vixie cronの仕様では、日と曜日の両方が「*」以外に制限されている場合「どちらか一方に一致すればよい」というOR条件になります。そのため本ツールはこのケースを検出すると警告を表示し、変換結果が元のOnCalendar式より広い条件(実行頻度が多い)になっている可能性を伝えます。

cron式には年を指定するフィールドが存在しないため、OnCalendar式に年の指定(「*」以外の値)があってもcronへの変換時には無視されます。本ツールはこの場合警告を表示し、変換結果が指定した年に関わらず毎年実行される点を伝えます。

cron_to_systemdツールが生成する主要なパターン(毎分・毎時・毎日・毎週・毎月・毎年・ステップ指定・範囲指定・リスト指定・曜日指定・名前付きショートカット)はカバーしていますが、OnCalendar構文はcronより表現力が高いため、非常に複雑な指定(複数の年、秒単位の細かい反復など)はcronで正確に表現できず、変換に失敗する場合があります。
ツールくん

余談ですが ― systemdタイマーからcronへ「戻る」ということ

一般に技術移行は一方向(古い仕組みから新しい仕組みへ)に語られがちですが、実際の現場ではその逆方向の変換が必要になる場面も少なくありません。systemdタイマーを採用したホスト環境から、cronしかサポートしていない軽量なコンテナや、cron形式のスケジュール記法を採用しているオーケストレーションツール(Kubernetes CronJobなど)へワークロードを移設する際、OnCalendar構文をcron式に戻す作業が発生します。

この「逆変換」が単純な一対一の対応にならないのは、systemdのOnCalendar構文がcronより表現力の高い仕様だからです。年単位の指定・秒単位の精度・日付と曜日のAND条件的な組み合わせなど、cronの5フィールドでは表現しきれない概念を持っています。そのため本ツールは「よく使われる主要なパターンを正確に変換する」ことを目標とし、対応しきれない複雑な指定は変換エラーとして扱う設計にしています。

日と曜日を両方指定した場合の意味論の違い(systemdはAND条件、cronはOR条件)は、この逆変換における最大の落とし穴です。「毎月1日」かつ「月曜日」という条件を、systemdは「1日でありかつ月曜日である日」だけに絞り込みますが、cronでは「1日である日、または月曜日である日」の両方で実行されてしまいます。本ツールがこの点を明示的に警告するのは、移行時に見落とされがちなこの意味の変化に気づいてもらうためです。