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タイマーからcronへ「戻る」ということ
一般に技術移行は一方向(古い仕組みから新しい仕組みへ)に語られがちですが、実際の現場ではその逆方向の変換が必要になる場面も少なくありません。systemdタイマーを採用したホスト環境から、cronしかサポートしていない軽量なコンテナや、cron形式のスケジュール記法を採用しているオーケストレーションツール(Kubernetes CronJobなど)へワークロードを移設する際、OnCalendar構文をcron式に戻す作業が発生します。
この「逆変換」が単純な一対一の対応にならないのは、systemdのOnCalendar構文がcronより表現力の高い仕様だからです。年単位の指定・秒単位の精度・日付と曜日のAND条件的な組み合わせなど、cronの5フィールドでは表現しきれない概念を持っています。そのため本ツールは「よく使われる主要なパターンを正確に変換する」ことを目標とし、対応しきれない複雑な指定は変換エラーとして扱う設計にしています。
日と曜日を両方指定した場合の意味論の違い(systemdはAND条件、cronはOR条件)は、この逆変換における最大の落とし穴です。「毎月1日」かつ「月曜日」という条件を、systemdは「1日でありかつ月曜日である日」だけに絞り込みますが、cronでは「1日である日、または月曜日である日」の両方で実行されてしまいます。本ツールがこの点を明示的に警告するのは、移行時に見落とされがちなこの意味の変化に気づいてもらうためです。