2026年5月21日

2026年5月21日

systemdのユニットファイルを作成する方法

はじめに

自作のシェルスクリプトやアプリケーションをサーバー起動時に自動で立ち上げたい、異常終了したら自動再起動させたい、というときに使うのが systemd の「ユニットファイル」です。

ユニットファイルを /etc/systemd/system/ に配置することで、systemctl で他のサービスと同じように制御できます。本記事では .service ユニットの基本構造と、よく使うディレクティブを実例付きで解説します。

症状・背景

systemdユニットファイル が必要になる主な場面:

  • 独自のNode.js/Pythonアプリを常駐させたい
  • スクリプトを起動時に自動実行したい
  • プロセスがクラッシュしても自動で再起動させたい
  • 既存サービスの設定をオーバーライドしたい

手順・設定方法

ステップ1: ユニットファイルの基本構造

# 配置場所
sudo vi /etc/systemd/system/myapp.service
[Unit]
Description=My Application
After=network.target

[Service]
Type=simple
User=myapp
WorkingDirectory=/opt/myapp
ExecStart=/usr/bin/node /opt/myapp/server.js
Restart=on-failure
RestartSec=5s

[Install]
WantedBy=multi-user.target

ステップ2: 主要ディレクティブ

# [Service] セクションでよく使うもの
Type=simple        # フォアグラウンド実行 (デフォルト)
Type=forking       # daemonize するプロセス用
Type=oneshot       # 一度だけ実行 (バッチ系)

ExecStart=/path/to/program
ExecStop=/path/to/stop      # 任意
ExecReload=/bin/kill -HUP $MAINPID

Restart=on-failure          # 異常終了時のみ再起動
Restart=always              # 常に再起動
RestartSec=5s

Environment="NODE_ENV=production"
EnvironmentFile=/etc/myapp.env

ステップ3: 有効化と動作確認

# ユニットファイルを再読み込み
sudo systemctl daemon-reload

# 起動と自動起動を有効化
sudo systemctl enable --now myapp

# 状態確認
sudo systemctl status myapp
sudo journalctl -u myapp -n 50

# 試しに停止・再起動
sudo systemctl restart myapp

ステップ4: 応用 (タイマーとオーバーライド)

# 既存サービスの一部だけ上書き (drop-in)
sudo systemctl edit nginx
# 自動で /etc/systemd/system/nginx.service.d/override.conf が作られる

# タイマーユニット例 (毎日3時に実行)
sudo vi /etc/systemd/system/backup.timer
[Unit]
Description=Daily backup

[Timer]
OnCalendar=*-*-* 03:00:00
Persistent=true

[Install]
WantedBy=timers.target

注意事項

  • ユニットファイルを編集したら必ず systemctl daemon-reload を実行しないと反映されません
  • ExecStart には絶対パス必須。PATH に頼った相対パスは動きません
  • User= で実行ユーザーを指定する場合、ファイルの権限が適切か確認しましょう
  • Restart=always と短い RestartSec の組み合わせはCPUを食う暴走を招くことがあります

まとめ

1. 構造: [Unit] / [Service] / [Install] の3セクション

2. 配置: /etc/systemd/system/NAME.service に保存

3. 再読込: 編集後は daemon-reload が必須

4. 再起動: Restart=on-failure で異常停止を自動復旧

5. 応用: drop-in で既存ユニットを部分上書き

関連記事:

お気軽にご相談ください

お見積りへ お問い合わせへ