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-restarting
は yum-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 # 何も出力されずに次のプロンプトになった
再起動が必要なサービスが無いので、こちらも何も出力されなかった。
これで、アップデートの時に何を再起動すればよいのかの確認ができた。