【Linux】systemctlでサービスの自動起動が有効か確認する方法

【Linux】systemctlでサービスの自動起動が有効か確認する方法 AWS

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"

動作を確認する

自動起動の設定を変えたら、次の順で確かめます。

  1. 設定が enabled になっていることを確認する
systemctl is-enabled nginx.service
enabled
  1. インスタンスを再起動する
sudo systemctl reboot
  1. 再接続して、サービスが動いていることを確認する
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
この記事を書いた人

渋谷で働くよわよわエンジニア。TypeScript(Next.js/Node.js)/Golang/AWS/Flutterなど
LINE API Expert(2023/1~)

tokkuをフォローする
オススメ記事
在宅ワークが多くなって、デスクの配線周りに困っている方は、拡張デスクの導入がおすすめです。Windows/MacOS/Linuxの複数の機器をスッキリとデスク周りに収める事ができました!リモートからサーバーメンテを行うインフラエンジニアは必見です!
AWS
シェアする
tokkuをフォローする

コメント

タイトルとURLをコピーしました