Type=simple / forking / oneshot の違い|systemd Unit設定の落とし穴

  • URLをコピーしました!

systemdのUnitファイルで必ず登場する Type=

この指定を誤ると、

  • 起動したのにすぐ落ちる
  • activeなのにプロセスがいない
  • 依存サービスが正しく起動しない

といった非常に分かりにくい障害が発生します。

本記事では、Type=simple / forking / oneshot の違いを、

  • 仕組み
  • 典型ユースケース
  • 設定ミス時の症状

まで踏み込んで解説します。

目次

Typeとは何か?

Type= は、「systemdがサービスの起動完了をどう判断するか」を定義します。

つまり、

  • いつ起動完了とみなすか
  • どのプロセスを監視対象にするか

を決める極めて重要な設定です。

Type=simple

概要

ExecStartを実行した瞬間に起動完了とみなす、最もシンプルなタイプです。

特徴

  • デフォルトのType
  • プロセスがフォアグラウンドで動作する前提

設定例

[Service]
Type=simple
ExecStart=/usr/bin/python3 /opt/app/app.py

向いているケース

  • デーモン化しないアプリ
  • Go / Python / Java などの常駐アプリ

よくある事故

デーモン化するプログラムを指定すると、

  • 親プロセス終了 → systemdは「終了」と判断
  • サービスがすぐinactiveになる

Type=forking

概要

プロセスがforkして親が終了したら起動完了と判断します。

特徴

  • 昔ながらのデーモン向け
  • PIDファイルと併用されることが多い

設定例

[Service]
Type=forking
PIDFile=/var/run/myapp.pid
ExecStart=/usr/local/bin/myapp start
ExecStop=/usr/local/bin/myapp stop

向いているケース

  • Apache / Nginx / 独自デーモン
  • バックグラウンド化するプログラム

よくある事故

  • PIDFileが作られない
  • Type=simpleのまま使って即落ち

Type=oneshot

概要

処理を一度実行して終了するサービス向けです。

特徴

  • 常駐プロセスを持たない
  • 処理成功=active (exited)

設定例

[Service]
Type=oneshot
ExecStart=/usr/local/bin/init-script.sh
RemainAfterExit=yes

向いているケース

  • 初期化処理
  • 設定反映
  • マウント前処理

RemainAfterExit の重要性

これを指定しないと、

  • 実行後すぐ inactive になる
  • 依存サービスが起動しない

Type別の違いまとめ

Type起動完了判断用途
simpleExecStart実行直後常駐アプリ
forking親プロセス終了デーモン
oneshot処理終了単発処理

Typeミス時に出る典型症状

  • active → inactive に即変わる
  • Start request repeated too quickly
  • 依存サービスが起動しない

実務での判断基準

  • 常駐する? → simple
  • 自分でdaemonizeする? → forking
  • 一回実行だけ? → oneshot

まとめ

Type指定は「形式的な設定」ではなく、 systemdがどうサービスを理解するかを決める中核です。

起動トラブルの多くは、

  • Typeとアプリの挙動が合っていない

ことが原因です。

Typeを正しく選ぶだけで、systemd障害の半分は防げます。

目次