mopoki’s blog

技術的なものの備忘録

CentOS 7 で再起動が必要なサービスを確認できる、またはホストの再起動まで必要なのかを確認できるコマンド needs-restarting

なにかのパッケージを yum update などでアップデート後、サービスを再起動するだけでよいのか、またはホストの再起動をしないといけない状態なのかを調べたい。 それらを確認できるコマンド needs-restarting があるので使い方をまとめる。

確認環境

CentOS 7

# cat /etc/redhat-release
CentOS Linux release 7.8.2003 (Core)

なお、Red Hat Enterprise Linux のリリースノートを見ると、この記事で書いてあるオプションは 7.3 以降で追加された機能らしい。

第18章 システムとサブスクリプション管理 Red Hat Enterprise Linux 7 | Red Hat Customer Portal

needs-restarting ユーティリティーに新しい --services オプションを追加

needs-restarting ユーティリティーに新しい --reboothint オプションを追加

needs-restarting とは

まず、man は以下にある。

needs-restarting(1) - Linux manual page

また、Red Hat Customer Portal の discussion に以下のようなスレッドがある。

How to check if a host needs to reboot? - Red Hat Customer Portal

needs-restartingyum-utils パッケージでインストールされるとある。

whereis コマンドで、needs-restarting のコマンドのバイナリなどがどこにあるか確認する
# whereis needs-restarting
needs-restarting: /usr/bin/needs-restarting /usr/share/man/man1/needs-restarting.1.gz

/usr/bin/needs-restarting にあるのが確認できた。何のパッケージでインストールされるのかも確認する。

needs-restarting コマンドが何のパッケージでインストールされるかを、rpm コマンドで確認する。
# rpm -qf /usr/bin/needs-restarting
yum-utils-1.1.31-52.el7.noarch
yum-utils-1.1.31-53.el7.noarch

-q | --query は検索オプション、-f | --file FILE はその中の選択オプションで、FILEに指定されたものを所有するパッケージを検索する。

rpmコマンドではなく、yum provides コマンドでもよい。
# yum provides /usr/bin/needs-restarting
yum-utils-1.1.31-53.el7.noarch : Utilities based around the yum package manager
リポジトリー        : base
一致          :
ファイル名    : /usr/bin/needs-restarting

yum-utils-1.1.31-53.el7.noarch : Utilities based around the yum package manager
リポジトリー        : @base
一致          :
ファイル名    : /usr/bin/needs-restarting

使い方

needs-restarting コマンドの使い方は以下の通り。

  • オプションなしだと、更新される前に実行してたコンポーネントのプロセスidをリストで表示する。つまり、再起動が必要なプロセスがわかる。
  • -u, --useronly だと、自分のuseridのプロセスだけ見える。使える場所があるんだろうか?
  • -r, --reboothint だと、ホスト再起動まで必要なものだけを表示してくれる。表示するものがあると 終了ステータスで 1 を返して、ないと 0 を返す。
  • -s, --servicesだと、systemd で管理されているサービス名で表示する。
    RHELのリリースノートの説明では、プロセス ID の代わりにサービス名を改行の区切りで一覧表示して、その更新内容の有効にするために再起動する必要のある systemd サービスを特定できるとある。

試してみる

rootユーザで試してみる

まずオプションなし
# needs-restarting
1304 : /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
3715 : /usr/libexec/gsd-disk-utility-notify
1306 : /usr/sbin/gdm
1300 : /usr/bin/containerd
3494 : /usr/libexec/gvfs-goa-volume-monitor
1309 : /usr/sbin/atd -f
3322 : /usr/libexec/at-spi2-registryd --use-gnome-session
3415 : ibus-daemon --xim --panel disable
4228 : /usr/libexec/bluetooth/obexd
3419 : /usr/libexec/ibus-dconf
3717 : /usr/libexec/evolution-calendar-factory
3554 : /usr/libexec/gsd-rfkill
3552 : /usr/libexec/gsd-print-notifications
3558 : /usr/libexec/gsd-screensaver-proxy
818 : /usr/sbin/mcelog --ignorenodev --daemon --syslog
・・・省略・・・

プロセスidの順番で表示されるわけではないようだ。

次に -r ホスト再起動が必要かどうか
# needs-restarting -r
Core libraries or services have been updated:
  linux-firmware -> 20191203-76.gite8a0f4c.el7
  systemd -> 219-73.el7_8.5
  kernel -> 3.10.0-1127.el7
  glibc -> 2.17-307.el7.1

Reboot is required to ensure that your system benefits from these updates.

More information:
https://access.redhat.com/solutions/27943

終了ステータスが何で帰ってきてるかも確認
# echo $?
1

ちょうどアップデートがあったときなので、再起動が必要な状態が見えている。終了ステータスも表示物があるので 1 が返ってきてる。

表示されている URL は、まさに needs-restarting についてのRed Hat ナレッジベースの回答だった。

Which packages require a system reboot after the update? - Red Hat Customer Portal

最後に -s systemdの管理サービス名で表示
# needs-restarting -s
chronyd.service
dbus.service
containerd.service
ModemManager.service
libvirtd.service
libstoragemgmt.service
atd.service
systemd-logind.service
colord.service
gdm.service
wpa_supplicant.service
packagekit.service
NetworkManager.service
docker.service
auditd.service
accounts-daemon.service
systemd-udevd.service
mcelog.service
sshd.service
bolt.service
rtkit-daemon.service
upower.service
systemd-journald.service
alsa-state.service

確かに、何のサービス名を再起動すればよいのか見やすくなった。

再起動後

今回はホスト再起動が必要なものがあるので、さっさと再起動してしまう。

ホスト再起動後、コマンドの表示がどう変わるか確認する。

再起動後に試す
# needs-restarting
#
何も出力されずに次のプロンプトになった

オプションを付けない状態では、本当になにも出力されない。

次に -r ホスト再起動が必要かどうか
# needs-restarting -r
No core libraries or services have been updated.
Reboot is probably not necessary.
# echo $?
0

終了ステータスが0となる以外に、再起動はおそらく必要ないと出力された。

最後に -s systemdの管理サービス名で表示
# needs-restarting -s
#
何も出力されずに次のプロンプトになった

再起動が必要なサービスが無いので、こちらも何も出力されなかった。

これで、アップデートの時に何を再起動すればよいのかの確認ができた。