古いパッケージで実行され、再起動が必要なプロセスを確認するにはどうすればよいですか?

古いパッケージで実行され、再起動が必要なプロセスを確認するにはどうすればよいですか?

したがって、現在のプロセスで使用されている削除されたファイルを表示または復元することが可能であることがわかります。私はこれが最新のパッケージでも動作することがわかりました。したがって、パッケージを更新しましたが、他のプロセスでまだ使用されており、まだ再起動されていないため、以前のバージョンのパッケージで実行されているとします。私の質問は再起動しないため、このパッケージの以前のバージョンでどのプロセスが実行されているかを確認することです。

答え1

共有ライブラリinodeはに登録されています/proc/PID/maps。つまり、nginxFedora 36で実行されます。

7f9190a00000-7f9190a9a000 r--p 00000000 103:04 794344                    /usr/lib64/libstdc++.so.6.0.30

このファイルのフォーマットの説明ここ

デフォルトでは、5番目のフィールドはinode番号です。ライブラリを更新したら、/proc/[0-9]+/maps各共有ライブラリが実際のファイルシステムの対応物と一致することを確認する必要があります。実際のファイルinode番号を取得するには、ls --inode /path/fileまたはを使用できますstat --printf=%i /path/file

以下は、これらのプロセスを示す先ほど作成したスクリプトです。

#! /bin/bash

cd /proc || exit 1

for i in [0-9]*; do
    test ! -d $i && continue # PID could have already died
    awk '$6 ~ /\// {print $5" "$6}' "$i/maps" | sort -u | while read inode_p so; do
            if [ -f "$so" ]; then
                inode_r=`stat --format=%i "$so"`
                test "$inode_p" != "$inode_r" && echo "PID $i `cat $i/comm` maps stale file '$so'"
            fi
    done
done

見せるみんなマッピングファイルの問題です。共有ライブラリのみに制限するには、-f "$so"に置き換えます-e "$so"

関連情報