## はじめに
自作のシェルスクリプトやアプリケーションをサーバー起動時に自動で立ち上げたい、異常終了したら自動再起動させたい、というときに使うのが systemd の「ユニットファイル」です。
ユニットファイルを `/etc/systemd/system/` に配置することで、`systemctl` で他のサービスと同じように制御できます。本記事では `.service` ユニットの基本構造と、よく使うディレクティブを実例付きで解説します。
## 症状・背景
systemdユニットファイル が必要になる主な場面:
– 独自のNode.js/Pythonアプリを常駐させたい
– スクリプトを起動時に自動実行したい
– プロセスがクラッシュしても自動で再起動させたい
– 既存サービスの設定をオーバーライドしたい
## 手順・設定方法
### ステップ1: ユニットファイルの基本構造
“`bash
# 配置場所
sudo vi /etc/systemd/system/myapp.service
“`
“`ini
[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: 主要ディレクティブ
“`ini
# [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: 有効化と動作確認
“`bash
# ユニットファイルを再読み込み
sudo systemctl daemon-reload
# 起動と自動起動を有効化
sudo systemctl enable –now myapp
# 状態確認
sudo systemctl status myapp
sudo journalctl -u myapp -n 50
# 試しに停止・再起動
sudo systemctl restart myapp
“`
### ステップ4: 応用 (タイマーとオーバーライド)
“`bash
# 既存サービスの一部だけ上書き (drop-in)
sudo systemctl edit nginx
# 自動で /etc/systemd/system/nginx.service.d/override.conf が作られる
# タイマーユニット例 (毎日3時に実行)
sudo vi /etc/systemd/system/backup.timer
“`
“`ini
[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 で既存ユニットを部分上書き
関連記事:
– [systemctlでサービスを管理する方法](../linux-systemctl-service/)
– [journalctlでsystemdログを確認する方法](../linux-journalctl-logs/)
– [シェルスクリプトの基本的な書き方](../linux-shell-script-basics/)



