アプリを & や 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
ExecStart、WorkingDirectory、User をアプリに合わせて調整します。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 # 起動時の開始をやめる
正直な注意点
- ユニットファイルを編集したら
daemon-reloadを実行してください。さもないと systemd は古い版を使います。 - クラッシュループに注意。 アプリが即座に失敗すると、
Restart=alwaysは永遠に再試行します —RestartSec=5が試行の間隔を空けます。ログから根本のエラーを直してください。 - 非 root の
User=を優先し、侵害されたアプリがサーバー全体を所有しないように。
次のステップ
systemd サービスは、何かを 24/7 動かし続けるための手段です — たとえば四六時中動く AI エージェントや、セルフホストの RustDesk サーバーの背後にあるリレーです。アプリが代わりにコンテナ化されているなら、Docker の --restart unless-stopped が同じ役割を果たします — Docker のインストール方法を参照してください。
コメント
まだコメントはありません。最初になりましょう。