piapia123
ja

systemd タイマー:OnCalendar の解析とユニット生成

Web

処理はすべてブラウザ内で完結します。データは送信されません

入力
ファイルをここにドロップすると読み込めます
出力

`OnCalendar=` は cron に似ていますが挙動は同じではなく、落とし穴は細部にあります。`a/b` はステップ(`*:0/15` は毎時の 0・15・30・45 分)、`~N` は月末から数えた日、曜日と月は名前で書けます。最も間違えやすいのは、曜日と日付を同時に指定すると「AND」になる(cron の「OR」と逆)という点です。本ツールは選んだタイムゾーンで次回以降の実行時刻を計算し(ローカル時刻と UTC を併記)、式を項目ごとに解説し、対になる .timer と .service を生成します。 解析と計算はすべてブラウザ内で完結します(タイムゾーン換算はブラウザ標準の日付機能を使用)。通信も送信も行いません。

機能

  • *、範囲 a..b、ステップ a/b、名前での曜日・月、~(月末から数える)に対応
  • 選択したタイムゾーンで次回以降の実行時刻を 1〜20 件計算
  • 各時刻をローカル時刻(オフセット付き)と UTC で併記
  • 曜日・日付・時刻がそれぞれ何を意味するかを解説
  • 対になる .timer と .service を生成
  • .timer ファイル全体の貼り付けにも対応
  • systemd と cron の「AND / OR」の違いを明示
  • すべてローカルで計算し、通信しません

使い方

  1. OnCalendar の値を入力するか、.timer ファイル全体を貼り付けます
  2. タイムゾーンと表示する件数を選びます
  3. 次回以降の実行時刻と項目ごとの解説を確認します
  4. 生成された .timer と .service をコピーします

よくある質問

OnCalendar と cron は何が違うのですか?
主に 2 点です。1 つ目は、曜日と日付を同時に指定したとき、cron は「OR」、systemd は「AND」であることです。cron の `0 9 * * 1` は毎週月曜 9 時ですが、systemd の `Mon *-*-01 09:00` は「月曜かつ 1 日」で、年に数回しか実行されません。2 つ目は、systemd では `OnCalendar=` を複数行書いて 1 つのユニットを起動でき(これが OR に相当します)、曜日や月を名前で書けて読みやすいことです。
*:0/15 はどういう意味ですか?
「毎時 0・15・30・45 分」という意味です。`0/15` は「0 から始め、15 刻みで、そのフィールドの上限まで」(分なら 59)と読み、0・15・30・45 になります。`0/15` を「0 から 0」と誤読すると 0 だけが残ります — エラーにはならず、結果は完全に間違いです。
なぜタイムゾーンで結果が変わるのですか?
`OnCalendar=` がローカルタイムで評価されるからです。同じ `*-*-* 03:00:00` でも、UTC のマシンでは 03:00 UTC、上海のマシンでは 19:00 UTC(前日)になります。そこで本ツールはタイムゾーンを明示させ、ローカル時刻と UTC を併記します。ユニットファイルを別のマシンへ移す前に、そのマシンのタイムゾーンを確認してください。
`~` は何ですか?
月末から数えた日を表します。`*-*-~1` は毎月の最終日、`*-02-~03` は 2 月の最後から 3 日目です。しかも月の長さに自動で追従します(うるう年の 2 月は 29 日なので、最後から 3 日目は 27 日)。`28` を直接書くよりはるかに確実です。
.timer になぜ .service が必要なのですか?
systemd では、timer は「いつ実行するか」だけを決め、「何を実行するか」は service に書くからです。通常は同名で(`backup.timer` が `backup.service` を起動)、`Unit=` で別名も指定できます。本ツールは動く骨組みを生成するので、`ExecStart=` は自分のコマンドに置き換えてください。

関連ツール