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 で既存ユニットを部分上書き
関連記事: