Linuxにおける「アップデートしたのに反映されない」問題
IT業界に入りたての頃、私はdnf update -yを実行して進捗バーが100%になれば、すべて完了したと思い込んでいました。しかし、現実はもっとシビアでした。ある時、緊急のセキュリティパッチを適用するためにOpenSSLをアップデートしたのですが、脆弱性スキャンを再度行うと、システムは依然として「未修正」と報告してきました。理由は単純でした。古いプロセスが依然としてRAM上の古いライブラリを読み込んでいたからです。新しいパッチはディスク上に置かれていたものの、まだアクティブ化されていなかったのです。
最近、CentOS 7からCentOS Stream 9へのシステム移行をサポートしている際、多くの人がアップデート後の確認ステップを忘れていることに気づきました。サーバー全体を再起動しないのであれば、どのサービスが古いコードで「粘っている」のかを正確に把握する必要があります。ここで、dnf-plugins-coreパッケージ、具体的にはneeds-restartingコマンドが真価を発揮します。
dnf-utilsとneeds-restartingとは?
CentOS Stream 9では、dnfが標準のパッケージマネージャーです。高度な機能を利用するには、dnf-plugins-core(以前のdnf-utilsの新しい名称)を追加インストールする必要があります。このパッケージは、リポジトリの管理やシステム状態を詳細にチェックするためのツールを提供します。
needs-restartingコマンドは、実行中のすべてのプロセスをスキャンし、それらをディスク上の実行ファイルと比較します。アップデートされた.soライブラリがあるにもかかわらず、プロセスがまだ古いバージョンを使用していることを検知すると、即座に警告を表示します。
CentOS Stream 9でのdnf-utilsのインストール
CentOS Stream 9のMinimalインストール版の多くでは、これらのツール群が省略されています。以下のコマンドで素早く追加できます。
sudo dnf install dnf-plugins-core -y
インストールが完了すると、config-managerやneeds-restartingといった強力なコマンドがすぐに使えるようになります。
システムを管理するためのneeds-restartingの3つの使い方
むやみにサーバーを再起動してはいけません。本番環境(Production)では、1秒のダウンタイムも貴重です。私は正確な判断を下すために、通常以下の3つのオプションを使用します。
1. 再起動が必須かどうかを確認する
Kernelをアップデートした場合、それを適用する唯一の方法はシステムの再起動です。-rフラグを使って確認しましょう。
needs-restarting -r
結果は非常に明確です:
- 何も表示されない場合:システムは正常で、再起動の必要はありません。
- “Reboot is required”と表示された場合:メンテナンスのスケジュールを立てる時期が来ました。
2. 再起動が必要な具体的なサービスをリストアップする
これは最も価値のある機能です。マシン全体を再起動する代わりに、NginxやMariaDBだけを再起動すれば済む場合があります。-sフラグを使用します。
needs-restarting -s
例えば、glibcをアップデートした後の出力結果には、通常以下のようなものが含まれます:
# 実際の出力例:
nginx.service
httpd.service
sshd.service
この場合、systemctl restart <サービス名>を実行して、それらをリフレッシュするだけで済みます。
3. 古いファイルを使用しているプロセスID(PID)を追跡する
systemdを介さない自作アプリ(カスタムアプリ)を実行している場合は、フラグなしでコマンドを実行してください:
needs-restarting
このコマンドは、PIDとファイルパスの詳細をリストアップします。これにより、どのアプリケーションが古い「遺産」を使用して動作しているかを正確に把握し、手動で介入することができます。
実務における運用のコツ
サーバーの安全性を確保しつつ、不必要なダウンタイムを避けるため、私は通常以下の4ステップのチェックリストを適用しています:
- Update: アクセスの少ない時間帯(通常は午前2時頃)に
dnf updateを実行。 - Check reboot:
needs-restarting -rを使用して、システム全体の再起動が必要か確認。 - Check services:
needs-restarting -sを使用して、影響を受けるサービスのリストを抽出。 - 順次対応: まずは
reloadを優先。それでもneeds-restartingが報告し続ける場合は、restartを実行。
以前、システムライブラリをアップデートした際、再起動が必要なサービスが20個にものぼったことがありました。その時は、以下のような短いスクリプトを使って素早く処理しました:
# サービスを自動的に再起動(実行前に必ずリストをよく確認してください)
for svc in $(needs-restarting -s); do
sudo systemctl restart $svc
echo "完了: $svc"
done
警告: PostgreSQLやMySQLなどの大規模なデータベースに対して、開発チームに事前に通知することなくこのスクリプトを実行してはいけません。接続が突然切断されるためです。
いくつかの注意点
needs-restartingコマンドは、稀に誤検知(false positive)をすることがあります。最も一般的なケースは、logrotateによって既に削除された古いログファイルをプロセスが開いたままにしている場合です。
CentOS Stream 9では、/procディレクトリ全体をスキャンする必要があるため、コマンドの完了までに5〜10秒かかることがあります。これは正常な動作であり、サーバーがハングアップしたわけではありません。
まとめ
サーバー管理は、単にパッケージをインストールして終わりではありません。dnf-utilsを使いこなすことで、セキュリティパッチが実際に機能していることを保証できます。アップデートのたびに確認する習慣をつけましょう。それはシステムの安定性を高めるだけでなく、仕事に対するあなたのプロ意識を示すことにも繋がります。

