したがって、現在のプロセスで使用されている削除されたファイルを表示または復元することが可能であることがわかります。私はこれが最新のパッケージでも動作することがわかりました。したがって、パッケージを更新しましたが、他のプロセスでまだ使用されており、まだ再起動されていないため、以前のバージョンのパッケージで実行されているとします。私の質問は再起動しないため、このパッケージの以前のバージョンでどのプロセスが実行されているかを確認することです。
答え1
共有ライブラリinodeはに登録されています/proc/PID/maps
。つまり、nginx
Fedora 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"
。