Upgrade to Pro — share decks privately, control downloads, hide ads and more …

cronの構造問題となぜsystemd.timerに移行すべきか

 cronの構造問題となぜsystemd.timerに移行すべきか

cronは現在も多くの現場で使われているツールですが、Amazon Linuxで非推奨となるなど、systemd.timerへの移行が求められる場面が増えています。移行したいが踏み込めていない方も多いのではないでしょうか。本セッションではtimerの便利さではなく、cronが抱える構造的な問題に焦点を当てて解説します。

Avatar for ryosuke

ryosuke

May 26, 2026

Other Decks in Technology

Transcript

  1. 自己紹介 職歴 元航空自衛官(IT実務未経験) サーバー運用経歴 年齢 出来事 18歳~ Windowsサーバー運用開始 22歳~ Linuxを触り始める

    24歳~ Arch Linux デスクトップ導入 / Raspberry Piでファイルサーバー構築 29歳~ 現在のDebian構成へ移行(現在に至る) 0.導入 © 2026 ryosuke 3
  2. Debianサーバー構成 ハード: Express5800/S70(通称:鼻毛鯖、2011年頃製) HDD増設用 鉄板マウント + SATA拡張カード コンテナ管理: Podman Quadlet

    DockerではなくPodmanでsystemdと統合 障害通知: ntfy(Pushover代替の通知サービス、自作unit) unitが失敗すると通知を発火 定期実行: cronは使わず全てsystemd.timer user unitとして運用 → 本題へ続く 0.導入 © 2026 ryosuke 4
  3. 最小権限の原則(原義) 設計原則 f) より原文冒頭から引用 f) Least privilege: Every program and

    every user of the system should operate using the least set of privileges necessary to complete the job. Primarily, this principle limits the damage that can result from an accident or error. — Saltzer & Schroeder, 1975 1.最小権限の原則とユーザーユニット © 2026 ryosuke 8
  4. 最小権限の原則(原義) 論文の位置づけ Saltzer & Schroeder (1975) はセキュリティ論文 設計原則(Design Principles) として分類されている

    設計原則とは (意訳)「セキュリティ上の欠陥のない実装を導くための経験から得られた原則」 1.最小権限の原則とユーザーユニット © 2026 ryosuke 9
  5. user unitの使い方 user unitの恒久化 $ sudo loginctl enable-linger username linger

    は居残りという意味 ログアウトするとunitが停止してしまうのを恒久的に防ぐ user unitの操作 $ systemctl --user enable --now hogehoge.service $ systemctl --user list-timers sudoを使わないので誤操作リスクが非常に低下する 1.最小権限の原則とユーザーユニット © 2026 ryosuke 12
  6. 具体的想定シナリオ サーバーを保守する3年目の先輩と1年目の新人がcron周辺のタスク障害対応 先輩が crond を一旦止める指示を出すが disable を一度実行してから stop を実行 その後

    start を実行して無事にcronは動き出す サーバー再起動時にcronがエラーを吐かずに起動しなくなる 2.cronの構造問題とsystemd.timerへの移行 © 2026 ryosuke 15
  7. cronは全てのタスクをsystem unitで管理する crond というsystem unitが全てのタスクを集中管理 ユーザー権限のタスクであろうとsystem unitで動いている ユーザー権限はuser unitとして運用するのが最小権限に沿った設計 集中管理をするということは、

    crond に関わる誤操作で全てのタスクが死ぬ これは最小権限の理念である被害範囲の局所化の考え方に反する 2.cronの構造問題とsystemd.timerへの移行 © 2026 ryosuke 17
  8. 最小構成の例 # hello.timer [Timer] OnCalendar=daily # hello.service [Service] ExecStart=/usr/bin/echo "Hello

    World!" 2.cronの構造問題とsystemd.timerへの移行 © 2026 ryosuke 22
  9. 私の自宅サーバーでの使い方 [Unit] OnFailure=notify@%n 各キーワードの意味 記述 意味 OnFailure= 失敗時に起動するユニットを指定 %n そのユニットファイル自身の名前に展開される

    [email protected] @ を含む テンプレートユニット( %i でインスタンス名を受け取れる) %i インスタンス名 テンプレートユニットの @ から . の間の部分 2.cronの構造問題とsystemd.timerへの移行 © 2026 ryosuke 23
  10. 私の自宅サーバーでの使い方 動作イメージ [email protected] というテンプレートユニットファイルを事前に作っておく。 backup.service が失敗 → [email protected] が呼び出され [email protected]

    が起動 通知したい各ユニットに OnFailure=notify@%n を書くだけ どのユニットが失敗したかを通知に乗せられる イベント駆動型なので常駐せずにリソースも食わない 2.cronの構造問題とsystemd.timerへの移行 © 2026 ryosuke 24
  11. 私の自宅サーバーでのファイル構成 少ないファイルで多くのユニットを管理する テンプレート タスク数 [email protected] / [email protected] 3個 [email protected] /

    scheduled- [email protected] 8個 [email protected] 上記 + その他個別タイマーやコン テナ = 28個 1つの通知テンプレートユニットファイルが39個のunitの失敗を報告 2.cronの構造問題とsystemd.timerへの移行 © 2026 ryosuke 25
  12. cronには失敗をトリガーとした通知の仕組みがない タスクが失敗しても… cronはエラーを検知して通知する手段がメールしかない 気づかないままバックアップが数週間止まっていた、という事故が起きうる systemd.timerなら OnFailure= で解決できる 失敗時に任意のunitを起動できる → 通知サービスと組み合わせるだけ

    cronのようにメール送信のためのMTAを立てる必要はない 通知の中身(WebhookやAPI呼び出し)を自分で自由に定義できる ただし全Unitに個別に書くと管理コストになる 新しいUnitを追加のたびに書き忘れるリスクがある 2.cronの構造問題とsystemd.timerへの移行 © 2026 ryosuke 26
  13. Unitの命名規則 systemdのunit名において - は階層の区切り文字として機能する sysmtedでは - はディレクトリ表現の / と同じような意味を持つ 例:

    scheduled-backup-daily.service scheduled → backup → daily という階層を表す scheduled/backup/daily のように変換して読める 2.cronの構造問題とsystemd.timerへの移行 © 2026 ryosuke 27
  14. ドロップイン 既存のUnitファイルを直接編集せずに設定を上書きする仕組み unit名.d/ ディレクトリに .conf ファイルを置くと自動で読み込まれる ~/.config/systemd/user/ ├── scheduled-backup-daily.service ←

    元のUnit └── scheduled-backup-daily.service.d/ └── override.conf ← これがドロップイン(上書き) override.conf に書いた設定が元のUnitにマージされる 2.cronの構造問題とsystemd.timerへの移行 © 2026 ryosuke 28
  15. プレフィックスに - 付けて途中で切り上げるドロッ プイン Unit名の途中までをディレクトリ名にして末尾を - にすると そのプレフィックスで始まる全Unitにドロップインが適用される ~/.config/systemd/user/ ├──

    scheduled-backup-daily.service ├── scheduled-backup-weekly.service ├── scheduled-backup-monthly.service └── scheduled-backup-.service.d/ ← ← ← ここ! └── override.conf ← 上記3つ全てに適用される scheduled-backup-daily も scheduled-backup-weekly も scheduled-backup- というプレフィックスを共有しているため全て対象 2.cronの構造問題とsystemd.timerへの移行 © 2026 ryosuke 29
  16. Dockerはcronとまったくおなじ問題を抱えている dockerd というsystem Unitが全てのコンテナを集中管理 ユーザーが起動したコンテナであろうとsystem unitで動いている これはcronで crond がユーザーのタスクを管理するのと同じ構造 dockerd

    は常にrootで常駐するデーモン docker.sock はroot所有 → 一般ユーザーが使うにはdockerグループへの追 加が必要 dockerグループへの追加は実質的なrootの付与と等価 つまり最小権限の原則(被害局所化)の精神に二重に反している 3.Dockerの構造問題とPodman Quadletへの移行 © 2026 ryosuke 32
  17. Quadletとは Podmanに同梱されているsystemdジェネレーター systemd unitとほぼ同じ記法 .container ファイルを置くだけでsystemd unitを自動生成する 宣言的に書けてGit管理しやすい # ユーザーか書くユニットファイル

    ~/.config/containers/systemd/ └── myapp.container # 自動生成される実体のユニットファイル /run/user/{UID}/systemd/generator/ └── myapp.service 3.Dockerの構造問題とPodman Quadletへの移行 © 2026 ryosuke 34
  18. まとめ:rootを極力触らずに運用できる 役割 移行前 移行後 定期実行 cron(system unit) systemd.timer(user unit) コンテナ

    Docker(root常駐デーモン) Podman Quadlet(user unit) 障害通知 なし / 個別実装 OnFailure=notify@%n 過去の失敗から経験的に誤操作を防ごうとした それが最小権限の原則の原義になっていた root権限を殆ど扱わずにユニットを運用できる 4.終章 © 2026 ryosuke 38
  19. 振り返り:3つの話の共通点 第1章:設計原則としての最小権限 → user unitという選択 第2章:cronの集中管理 → systemd.timerで分散・局所化 第3章:Dockerの集中管理 →

    Podman Quadletで分散・局所化 「rootで動かすな」の根拠は セキュリティではなく設計原則だった 4.終章 © 2026 ryosuke 39
  20. ご清聴ありがとうございました 執筆記事 (zenn - ryosuke) 参考文献 Saltzer & Schroeder (1975)

    "The Protection of Information in Computer Systems" systemd.unit man page: man systemd.unit systemd.timer man page: man systemd.timer quadlet man page: man podman-systemd.unit 4.終章 © 2026 ryosuke 40