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条件のため)。このようなケースでは変換結果の意味を必ず確認してください。

systemdタイマーをcron式へ戻す

systemd タイマーの `OnCalendar=` を、`分 時 日 月 曜日` という cron 式へ戻す変換ツールです。`daily` や `weekly` といった名前付きのショートカットにも対応しています。姉妹ツールの逆方向にあたります。

**この向きの変換で気をつけたいのは、systemd で書けることの一部が cron では表現できないという点です。** `OnCalendar=` は**秒単位の指定**も、`*-*-01..07` のような**日付の範囲**も書けますが、cron の5フィールドにはどちらも収まりません。加えて `Persistent=` のような「止まっていた間のぶんを取り戻す」性質も、cron 側には対応物がありません。**もう一つが日と曜日の意味論で、systemd は両方を AND として扱うのに対し、cron は OR として解釈します。** そのまま移すと実行頻度が増える側へずれるため、このツールは該当する場合に警告を出します。

変換の手順

  1. OnCalendar= の値を入力する `Mon *-*-* 06:00:00` のような形式や、`daily` などの名前でもかまいません。
  2. 生成された cron 式を確認する 5つのフィールドに対応づけられた結果が得られます。
  3. 警告を読む **cron では表現しきれない指定や、意味論の違いが示されます。**
  4. crontab へ書き写す 実行するコマンドを続けて書けば、そのまま登録できます。

使いこなすためのヒント

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

活用シーン

systemdの無い環境へ移す

**コンテナや古いUNIX系の環境では、cronしか使えないことがあります。**

既存のタイマーを読み解く

`OnCalendar=` の書式に馴染みがなくても、cron式に直せば頻度が掴めます。

2つの環境で同じ頻度を保つ

**本番がsystemd、開発がcronといった構成で、設定を突き合わせられます。**

スケジュールを棚卸しする

まとめて変換すると、意図した頻度になっているかを見直す機会になります。

スケジューラーの用語

OnCalendar=
systemdタイマーで実行時刻を指定するキーです。**曜日・日付・時刻を1行で書けます。**
cron式
`分 時 日 月 曜日` の5フィールドで実行時刻を表す書式です。**秒単位の指定はできません。**
名前付きショートカット
`daily`・`weekly`・`monthly` など、よく使う周期に付けられた別名です。
意味論の違い
**日と曜日を同時に指定したとき、systemdはANDで、cronはORで解釈します。**
Persistent=
止まっていた間に逃した実行を、起動後に取り戻す指定です。**cronには直接の対応物がありません。**
crontab
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日である日、または月曜日である日」の両方で実行されてしまいます。本ツールがこの点を明示的に警告するのは、移行時に見落とされがちなこの意味の変化に気づいてもらうためです。