systemd unitファイルの書き方完全テンプレ|実務で使える設定例付き

  • URLをコピーしました!

systemdのunitファイルは「なんとなく動く設定」と「事故らない設定」に大きな差があります。

本記事では、

  • 最低限の構成
  • 実務で必須の推奨設定
  • Type別テンプレ
  • 障害を防ぐための注意点

そのままコピペして使える完全テンプレとして解説します。

目次

unitファイルの基本構造

systemdのunitファイルは、以下の3セクションで構成されます。

[Unit]
[Service]
[Install]
  • [Unit]:依存関係・説明
  • [Service]:起動方法・プロセス管理
  • [Install]:自動起動設定

【最小構成】とりあえず動かすunit

[Unit]
Description=My App Service

[Service]
ExecStart=/usr/local/bin/myapp

[Install]
WantedBy=multi-user.target

これは検証用・学習用であり、実務では不十分です。

【実務推奨】標準unitテンプレ(Type=simple)

最も利用頻度が高い「常駐アプリ」向けのテンプレです。

[Unit]
Description=My Application Service
After=network.target

[Service]
Type=simple
User=myuser
Group=mygroup
ExecStart=/usr/local/bin/myapp
Restart=always
RestartSec=5
TimeoutStartSec=30
TimeoutStopSec=30
KillMode=process

[Install]
WantedBy=multi-user.target

このテンプレで防げる事故

  • 一時的な異常終了でサービスが止まりっぱなし
  • 起動失敗で無限再起動
  • root実行による権限事故

Type別 完全テンプレ

Type=simple(常駐アプリ)

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

Type=forking(デーモン)

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

Type=oneshot(単発処理)

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

必ず入れたい重要オプション

Restart

Restart=always
  • 障害時の自動復旧

RestartSec

RestartSec=5
  • 即再起動ループ防止

User / Group

User=appuser
Group=appgroup
  • root実行回避

依存関係の正しい書き方

network.target 待ち

[Unit]
After=network.target

他サービス依存

[Unit]
Requires=mysql.service
After=mysql.service

起動しない時のチェックポイント

  • ExecStartのパスは絶対パスか
  • 実行権限はあるか
  • Typeとプロセス挙動は一致しているか

確認コマンド

systemctl status myapp
journalctl -u myapp

unitファイル編集後に必ず行うこと

systemctl daemon-reload
systemctl restart myapp
systemctl enable myapp

daemon-reloadを忘れると変更は反映されません。

まとめ

systemd unitは「最低限動けばOK」ではなく、 異常時を前提に設計するものです。

本記事のテンプレを使えば、

  • 起動事故
  • 再起動ループ
  • 権限トラブル

を大幅に減らすことができます。

迷ったらこのテンプレを基準にしてください。

目次