EC2 や Compute Engine 上の Linux サーバーで、あるサービスが OS の起動時に自動で立ち上がる設定になっているかを確かめる方法をまとめます。systemctl enable で設定したつもりでも、再起動してみたら上がっていなかった、ということは珍しくありません。この記事では、サービス1つの確認、自動起動が有効なサービスの一覧、「自動起動が有効」と「いま動いている」の違いの見分け方を順に扱います。前提は systemd を採用したディストリビューション(Amazon Linux 2023、RHEL 9 系、Ubuntu 22.04 以降など)で、コマンドは systemd 公式の systemctl のマニュアルに沿っています。
サービス1つの自動起動を確認する
1. is-enabled で確認する
一番手早いのは systemctl is-enabled です。サービス名を渡すと、自動起動の設定状態を1語で返します。
systemctl is-enabled sshd.service
自動起動が有効なら次のように表示されます。
enabled
主な表示と意味は次のとおりです。
| 表示 | 意味 | 終了コード |
|---|---|---|
enabled |
自動起動が有効(/etc/systemd/system/ 配下にシンボリックリンクがある) |
0 |
disabled |
自動起動は無効。ユニットファイルに [Install] セクションがあるので enable できる |
0 以外 |
static |
[Install] セクションが無く、それ単体では enable できない。ほかのユニットから依存で起動される |
0 |
masked |
完全に無効化されていて、手動でも起動できない | 0 以外 |
not-found |
そのユニットファイルが存在しない | 4 |
.service は省略してもかまいません(systemctl is-enabled sshd でも同じです)。
2. status の Loaded 行で確認する
systemctl status でも自動起動の設定を確認できます。Loaded: 行のセミコロンで区切られた2つ目が自動起動の状態です。
systemctl status sshd.service
● sshd.service - OpenSSH server daemon
Loaded: loaded (/usr/lib/systemd/system/sshd.service; enabled; preset: enabled)
Active: active (running) since ...
この例では enabled が自動起動の設定、preset: enabled はディストリビューションが既定で有効にするかどうかの方針です。preset は「既定ではどうなるか」であって、今の設定ではありません。見るべきなのは preset: の前にある値です。
Active: 行は「いま動いているか」を表します。自動起動の設定とは別物なので、次の節で整理します。
「自動起動が有効」と「いま動いている」を分けて確認する
systemd では、次の2つが独立しています。
- 自動起動の設定(enabled / disabled): OS の起動時に立ち上げるかどうか。
systemctl enable/disableで変わる - 実行状態(active / inactive / failed): 今この瞬間に動いているかどうか。
systemctl start/stopで変わる
systemctl enable は自動起動の設定を作るだけで、サービスをその場では起動しません。逆に systemctl start で起動しただけのサービスは、再起動すると止まったままになります。両方を同時に確認するには、次の2つを並べて実行します。
systemctl is-enabled nginx.service
systemctl is-active nginx.service
| is-enabled | is-active | 状態 |
|---|---|---|
enabled |
active |
動いていて、再起動後も自動で上がる |
enabled |
inactive |
再起動後は上がるが、今は止まっている |
disabled |
active |
今は動いているが、再起動すると止まる |
enabled |
failed |
自動起動はしたが、起動に失敗している |
自動起動の設定と起動を一度に済ませたいときは、enable に --now を付けます。
sudo systemctl enable --now nginx.service
自動起動が有効なサービスを一覧で確認する
1. list-unit-files で一覧を出す
インストールされているユニットファイルと、その自動起動の状態を一覧にするのが systemctl list-unit-files です。サービスだけに絞るにはパターンを渡します。
systemctl list-unit-files '*.service'
UNIT FILE STATE
atd.service enabled
chronyd.service enabled
nginx.service disabled
sshd.service enabled
...
STATE 列が is-enabled と同じ自動起動の状態です。systemd のバージョンによっては、右に preset の列も表示されます。
2. enabled のものだけに絞る
自動起動が有効なものだけを見たいときは、STATE 列で絞ります。
systemctl list-unit-files '*.service' | awk '$2 == "enabled"'
grep enabled で絞ると、enabled-runtime や preset の列の enabled も拾ってしまうので、2列目を比べるほうが確実です。
3. 今動いているサービスの一覧と見比べる
今動いているサービスの一覧は list-units で出せます。
systemctl list-units --type=service --state=running
list-unit-files の enabled 一覧にあるのに、list-units の running 一覧に無いサービスは、自動起動したものの止まっているか、起動に失敗している候補です。失敗しているものだけを見るなら次のコマンドです。
systemctl list-units --type=service --state=failed
スクリプトで判定するときの注意
シェルスクリプトで自動起動の有無を判定するとき、is-enabled の終了コードだけで判断すると誤ります。上の表のとおり、static や alias も終了コード 0 を返すためです。enabled かどうかを知りたいなら、出力の文字列を比べます。
if [ "$(systemctl is-enabled nginx.service 2>/dev/null)" = "enabled" ]; then
echo "nginx: 自動起動は有効"
else
echo "nginx: 自動起動は有効ではない"
fi
表示を出さずに終了コードだけを使いたい場合は --quiet を付けます。
systemctl is-active --quiet nginx.service && echo "running"
動作を確認する
自動起動の設定を変えたら、次の順で確かめます。
- 設定が
enabledになっていることを確認する
systemctl is-enabled nginx.service
enabled
- インスタンスを再起動する
sudo systemctl reboot
- 再接続して、サービスが動いていることを確認する
systemctl is-active nginx.service
active
本番のインスタンスで再起動が難しいときは、1 で enabled を確かめたうえで、systemctl status の Loaded: 行にユニットファイルのパスが正しく出ているかまで見ておくと安心です。
うまくいかないとき
static と表示されて enable できない
ユニットファイルに [Install] セクションが無いと static になり、systemctl enable しても自動起動の設定は作られません。そのサービスはほかのユニット(ソケットやタイマーなど)から依存として起動される前提で作られています。自作のサービスで static になる場合は、ユニットファイルに次のような [Install] セクションを足してから enable します。
[Install]
WantedBy=multi-user.target
ユニットファイルを書き換えたあとは、設定を読み直します。
sudo systemctl daemon-reload
sudo systemctl enable nginx.service
masked と表示される
masked のサービスは /dev/null へのリンクになっていて、enable も start もできません。意図して止めているのでなければ、unmask してから有効にします。
sudo systemctl unmask nginx.service
sudo systemctl enable --now nginx.service
not-found と表示される
ユニット名が違うか、パッケージが入っていません。名前の候補は list-unit-files にパターンを渡して探せます。
systemctl list-unit-files '*nginx*'
enabled なのに再起動後に動いていない
自動起動はしたものの、起動に失敗している可能性があります。Active: 行が failed になっていないかを確かめ、ログを見ます。
systemctl status nginx.service
journalctl -u nginx.service -b
-b を付けると、今回の起動以降のログだけに絞れます。
参考
- systemctl(systemd 公式マニュアル): https://www.freedesktop.org/software/systemd/man/latest/systemctl.html
- systemd.unit(ユニットファイルの
[Install]セクション): https://www.freedesktop.org/software/systemd/man/latest/systemd.unit.html - systemd.preset(preset の仕組み): https://www.freedesktop.org/software/systemd/man/latest/systemd.preset.html
- journalctl(systemd 公式マニュアル): https://www.freedesktop.org/software/systemd/man/latest/journalctl.html



コメント