パッケージを更新したあと「このサーバーは再起動が必要なのか、それとも今のまま使い続けても問題ないのか」と迷うことがあります。闇雲に再起動するとサービス停止時間が発生し、逆に放置すると更新済みのカーネルやライブラリが反映されないまま運用が続きます。このページでは、再起動の要否を判断するための具体的な手順を説明します。
再起動が必要になるのはどのような場合か
パッケージ更新後に再起動が必要になる主なケースは次の2つです。
- カーネルが更新された場合:新しいカーネルは再起動するまで読み込まれません。脆弱性修正を含むカーネル更新では、再起動しない限り修正が有効になりません。
- コアライブラリが更新された場合:
glibc・libssl(OpenSSL)・libsystemdなどは、多くのプロセスが起動時に読み込みます。更新しても既存のプロセスはメモリ上の古いバージョンをそのまま使い続けるため、再起動またはサービス再起動が必要になります。
一方、設定ファイルだけが変わったパッケージや、自プロセスだけで完結するツールの更新は、一般的には再起動不要です。
Debian/Ubuntu系での確認方法
Debian・Ubuntu では、パッケージマネージャーがカーネルや主要ライブラリの更新を検出すると /var/run/reboot-required というファイルを自動的に作成します。このファイルが存在すれば再起動が推奨される状態です。
ls /var/run/reboot-required
ファイルが存在した場合、どのパッケージが要因かは次のコマンドで確認できます。
cat /var/run/reboot-required.pkgs
より詳しく調べたい場合は needrestart を使います。初回は次のコマンドでインストールできます。
sudo apt install needrestart
インストール後、次のように実行すると、再起動が必要なカーネルや、再起動が推奨されるサービスの一覧が表示されます。
sudo needrestart
対話プロンプトを表示せずに結果だけを確認したい場合は -b(batch)オプションが便利です。
sudo needrestart -b
RHEL/CentOS系での確認方法
RHEL・CentOS・AlmaLinux・Rocky Linux では needs-restarting コマンドが利用できます。このコマンドは dnf-utils(旧 yum-utils)パッケージに含まれています。
sudo dnf install dnf-utils
システム全体の再起動が必要かどうかを判断するには -r オプションを使います。終了コード 1 が返ればシステム再起動が推奨される状態です。
sudo needs-restarting -r
サービス単位での再起動が必要なプロセスを一覧表示するには -s オプションを使います。
sudo needs-restarting -s
オプションなしで実行すると、古いライブラリやバイナリを使用しているプロセスのリストが出力されます。
sudo needs-restarting
古いライブラリを使い続けているプロセスを直接調べる方法
ディストリビューションのツールに依存せず確認したい場合、/proc 経由でプロセスが読み込んでいるライブラリを確認する方法があります。Linux では削除済み(更新済み)のファイルをプロセスが開いたままにしていると、/proc/<PID>/maps に (deleted) という表示が現れます。
sudo grep -r '(deleted)' /proc/*/maps 2>/dev/null | grep '\.so' | awk -F'/' '{print $3}' | sort -u | while read pid; do
echo "PID $pid: $(cat /proc/$pid/comm 2>/dev/null)"
done
このコマンドは削除済みの共有ライブラリを読み込んでいるプロセスのPIDとコマンド名を表示します。表示されたプロセスは、そのサービスを再起動するか、システム全体を再起動するまで古いライブラリを使い続けています。
つまずきやすいポイント
/var/run/reboot-required が作られないケース
Ubuntu/Debian でも、パッケージによっては更新後にこのファイルが作成されないことがあります。カーネルや主要ライブラリ以外の更新では作成されないのが一般的な挙動です。ファイルが存在しなくても「再起動不要」と断言できるわけではないため、needrestart で補完するのが確実です。
needs-restarting が終了コード 1 を返しても表示が何もないとき
-r オプションは終了コードでのみ結果を示します。終了コード 1 はシステム再起動を推奨する意味であり、エラーを意味しません。スクリプトで使う場合は $? の値を確認してください。
コンテナや仮想マシンでのカーネル更新
コンテナ環境(Docker コンテナ内など)ではホスト側のカーネルを共有しているため、コンテナ内でカーネルパッケージを更新しても反映されません。カーネル更新の反映が必要な場合はホスト側の再起動が必要です。
再起動後にカーネルが切り替わっているか確認する
再起動後に想定のカーネルに切り替わっているかどうかは次のコマンドで確認できます。
uname -r
更新後のカーネルバージョンと一致していれば、カーネルの更新は正常に反映されています。
「コマンドは打てる。次は”現場で通用する型”を最短で身につけたい」——そんなあなたへ。
ネットの断片的なTipsをコピペするだけでは、体系的な運用スキルはなかなか積み上がりません。リナックスマスター.JPの無料メルマガ「リナマガ」では、現場で実際に使うLinuxサーバー運用の考え方を、順を追って実務目線でお届けしています。いま登録された方には、安全なサーバー構築の「型」をまとめた『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼント中です。
>> 図解60P『Linux入門マニュアル』を無料で受け取る
(メルマガ登録は10秒・いつでも解除OK)
※ 「独学の時間がもったいない」「プロから現場の技術を最短で学びたい」という本気の方には、2日で実務レベルが身につく初心者向けハンズオンセミナーもご用意しています。
