Restart=alwaysとは
Restart=alwaysは、Unitファイルの[Service]セクションに指定するプロパティであり、プロセスの終了理由を問わずサービスを自動的に再起動する設定である。正常終了・異常終了・シグナルによる強制終了のいずれの場合も再起動の対象になる。
一方、systemctl stopによって意図的に停止した場合は再起動されない。オペレーターの操作による停止と、プロセス側の要因による終了を区別して扱える。
使い方
Unitファイルの[Service]セクションに以下のように記述する。
[Service]
ExecStart=/path/to/command
Restart=always
動作確認
Dockerコンテナ上でsystemdを動かし、動作を確認する。
正常終了時に再起動されるか確認する
sleep 5を実行するだけのサービスを作成する。
[Unit]
Description=Restart demo service
[Service]
ExecStart=/bin/sleep 5
Restart=always
[Install]
WantedBy=multi-user.target
作成後、起動する。
$ sudo systemctl daemon-reload
$ sudo systemctl start restart-demo
sleep 5が終了する5秒より長く待ってからjournalctlで履歴を確認する。
$ journalctl -u restart-demo --no-pager
Jul 11 13:13:54 systemd[1]: Started Restart demo service.
Jul 11 13:13:59 systemd[1]: restart-demo.service: Deactivated successfully.
Jul 11 13:13:59 systemd[1]: restart-demo.service: Scheduled restart job, restart counter is at 1.
Jul 11 13:13:59 systemd[1]: Stopped Restart demo service.
Jul 11 13:13:59 systemd[1]: Started Restart demo service.
sleep 5が正常終了(Deactivated successfully)しているにもかかわらず、Scheduled restart jobによって即座に再起動されていることが分かる。
強制終了時も再起動されるか確認する
稼働中のプロセスにSIGKILLを送り、異常終了時も再起動されるか確認する。あわせてRestartSecで再起動までの待機時間を指定する。
[Service]
ExecStart=/bin/sleep 60
Restart=always
RestartSec=3
設定を反映し、サービスを再起動する。
$ sudo systemctl daemon-reload
$ sudo systemctl restart restart-demo
メインプロセスのPIDを確認し、kill -9で強制終了する。
$ systemctl show restart-demo -p MainPID
MainPID=126
$ sudo kill -9 126
強制終了した直後はactivating (auto-restart)という状態になり、再起動待ちであることが分かる。
$ systemctl status restart-demo
● restart-demo.service - Restart demo service
Loaded: loaded (/etc/systemd/system/restart-demo.service; disabled; preset: disabled)
Active: activating (auto-restart) (Result: signal) since Sat 2026-07-11 13:14:14 UTC; 1s ago
Process: 126 ExecStart=/bin/sleep 60 (code=killed, signal=KILL)
Main PID: 126 (code=killed, signal=KILL)
RestartSec=3で指定した3秒が経過すると、新しいPIDでサービスが再び稼働状態になる。
$ systemctl status restart-demo
● restart-demo.service - Restart demo service
Loaded: loaded (/etc/systemd/system/restart-demo.service; disabled; preset: disabled)
Active: active (running) since Sat 2026-07-11 13:14:17 UTC; 2s ago
Main PID: 145 (sleep)
journalctlでも、シグナルによる終了(Failed with result 'signal')を経て再起動されている経過が確認できる。
$ journalctl -u restart-demo --no-pager
Jul 11 13:14:14 systemd[1]: restart-demo.service: Main process exited, code=killed, status=9/KILL
Jul 11 13:14:14 systemd[1]: restart-demo.service: Failed with result 'signal'.
Jul 11 13:14:17 systemd[1]: restart-demo.service: Scheduled restart job, restart counter is at 1.
Jul 11 13:14:17 systemd[1]: Stopped Restart demo service.
Jul 11 13:14:17 systemd[1]: Started Restart demo service.
systemctl stopでは再起動されないことを確認する
systemctl stopで意図的に停止させた場合の挙動も確認する。
$ sudo systemctl stop restart-demo
$ systemctl status restart-demo
○ restart-demo.service - Restart demo service
Loaded: loaded (/etc/systemd/system/restart-demo.service; disabled; preset: disabled)
Active: inactive (dead)
inactive (dead)のまま再起動されず、Restart=alwaysはsystemctl stopによる意図的な停止までは上書きしないことが分かる。
Restart=on-failureとの違い
Restart=にはalwaysのほかにon-failureなどの値も指定できる。on-failureは、シグナルによる異常終了や非ゼロの終了コードなど失敗とみなされる終了時のみ再起動し、ExecStopやsystemctl stopによる正常な終了時は再起動しない。
Restart=alwaysは終了理由を問わず再起動するためon-failureより広い範囲をカバーするが、正常終了も再起動対象となる点は注意が必要である。ワンショットのバッチ処理など正常終了が期待される用途ではon-failureの方が適している場合が多い。
ユースケース
- 常駐が前提のアプリケーションサーバーやミドルウェアを、クラッシュ時に自動復旧させたい
- ネットワーク断などで意図せず終了するプロセスを、原因を問わず再起動させ続けたい
- 監視対象のプロセスにヘルスチェックの仕組みがなくても、systemd側で最低限の自動復旧を担保させたい
意図的な停止と障害による終了を区別しつつ、後者だけを継続的に復旧させたい場合はこの設定が適している。
