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 | 起動完了判断 | 用途 |
|---|---|---|
| simple | ExecStart実行直後 | 常駐アプリ |
| forking | 親プロセス終了 | デーモン |
| oneshot | 処理終了 | 単発処理 |
Typeミス時に出る典型症状
- active → inactive に即変わる
- Start request repeated too quickly
- 依存サービスが起動しない
実務での判断基準
- 常駐する? → simple
- 自分でdaemonizeする? → forking
- 一回実行だけ? → oneshot
まとめ
Type指定は「形式的な設定」ではなく、 systemdがどうサービスを理解するかを決める中核です。
起動トラブルの多くは、
- Typeとアプリの挙動が合っていない
ことが原因です。
Typeを正しく選ぶだけで、systemd障害の半分は防げます。
あわせて読みたい


systemd サービスが自動起動しない/Enable されないときの原因と対処
Linux サーバーでは systemd によるサービスの自動起動設定が広く利用されています。しかし、意図したサービスが再起動後に自動で立ち上がらない、あるいは systemctl e…
あわせて読みたい


systemdサービスが起動しない時の典型エラー集|原因別の調査手順と対処法
systemd管理のLinuxサーバーで、 サービスが起動しない activeにならない すぐ落ちる といったトラブルは非常によく発生します。 本記事では、現場で実際によく見る典型…
