EQVPS

アプリを動かし続ける systemd サービスの作り方

どんなスクリプトやアプリも、起動時に始まり、クラッシュしたら再起動し、journalctl にログを取る管理されたサービスに変えます。ユニットファイルを書き、有効化し、状態を確認する — Linux で何かを 24/7 動かす標準的な方法です。

アプリを &nohup で動かすのは、サーバーが再起動するか、プロセスがクラッシュするか、ログを探したくなるまでは問題ありません — そこで崩れます。systemd が標準の答えです。起動時にアプリを始め、死ねば再起動し、ログを取り込みます。スクリプトやバイナリを管理されたサービスに変えるのは、小さなファイル一つです。

1. ユニットファイルを書く

/etc/systemd/system/myapp.service を作成します:

[Unit]
Description=My application
After=network.target

[Service]
User=myapp
WorkingDirectory=/opt/myapp
ExecStart=/usr/bin/python3 /opt/myapp/run.py
Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target

ExecStartWorkingDirectoryUser をアプリに合わせて調整します。Restart=always こそが生かし続けるものです。

2. 専用ユーザーを作る(推奨)

sudo useradd --system --no-create-home --shell /usr/sbin/nologin myapp
sudo chown -R myapp:myapp /opt/myapp

非 root ユーザーで動かすことで、万一アプリが侵害されたときの被害を抑えます。

3. 有効化して起動する

sudo systemctl daemon-reload
sudo systemctl enable --now myapp

enable で起動時に始まり、--now で即座に起動します。

4. 状態とログを確認する

sudo systemctl status myapp
journalctl -u myapp -f       # ライブログを追う

日常のコマンド

sudo systemctl restart myapp   # 変更後に再起動する
sudo systemctl stop myapp      # 停止する
sudo systemctl disable myapp   # 起動時の開始をやめる

正直な注意点

次のステップ

systemd サービスは、何かを 24/7 動かし続けるための手段です — たとえば四六時中動く AI エージェントや、セルフホストの RustDesk サーバーの背後にあるリレーです。アプリが代わりにコンテナ化されているなら、Docker の --restart unless-stopped が同じ役割を果たします — Docker のインストール方法を参照してください。

よくある質問

アプリをただバックグラウンドで動かすのではなく、なぜ systemd を使うのですか?

バックグラウンドのプロセス(& や nohup)は再起動で死に、クラッシュしても戻らず、ログを散らばらせます。systemd サービスは起動時に自動で始まり、失敗すれば再起動し、出力を journalctl に送ります。Linux で長く生きるものを動かす、標準的で信頼できる方法です。

ユニットファイルはどこに置きますか?

自分のサービスは /etc/systemd/system/ に、サービスごとに一つ、something.service という名前で置きます。作成や編集の後は 'systemctl daemon-reload' を実行して systemd に変更を取り込ませ、それから有効化して起動します。

'Restart=always' は何をし、欠点はありますか?

systemd に、サービスが理由を問わず終了するたびに再起動するよう指示します — 何かを動かし続ける鍵です。唯一の落とし穴はクラッシュループです。アプリが起動時に即座に失敗すると、systemd は再起動し続けます。'RestartSec=5' を足して試行の間隔を空け、ログを見て根本のエラーを直してください。

サービスのログはどう見ますか?

ライブ出力を追うには 'journalctl -u yourservice -f'、履歴を読むには -f なしで使います。systemd は stdout と stderr を自動で取り込むので、自分でログファイルを配線する必要はありません。

サービスは root で動かすべきですか?

できれば避けてください。専用の非 root ユーザーを作り、ユニットに 'User=' を設定します。そうすればアプリの侵害がマシン全体を明け渡さずに済みます。root で動かすのはサービスが本当に必要とするときだけに。

コメント

まだコメントはありません。最初になりましょう。

コメントを残す

コメントは表示される前にモデレートされます。