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=alwayssystemctl stopによる意図的な停止までは上書きしないことが分かる。

Restart=on-failureとの違い

Restart=にはalwaysのほかにon-failureなどの値も指定できる。on-failureは、シグナルによる異常終了や非ゼロの終了コードなど失敗とみなされる終了時のみ再起動し、ExecStopsystemctl stopによる正常な終了時は再起動しない。

Restart=alwaysは終了理由を問わず再起動するためon-failureより広い範囲をカバーするが、正常終了も再起動対象となる点は注意が必要である。ワンショットのバッチ処理など正常終了が期待される用途ではon-failureの方が適している場合が多い。

ユースケース

  • 常駐が前提のアプリケーションサーバーやミドルウェアを、クラッシュ時に自動復旧させたい
  • ネットワーク断などで意図せず終了するプロセスを、原因を問わず再起動させ続けたい
  • 監視対象のプロセスにヘルスチェックの仕組みがなくても、systemd側で最低限の自動復旧を担保させたい

意図的な停止と障害による終了を区別しつつ、後者だけを継続的に復旧させたい場合はこの設定が適している。