因此,我知道可以查看或恢复进程当前正在使用的已删除文件。我发现这也适用于更新的软件包。因此,假设我们更新了一个包,但该包仍在被另一个进程使用,并且最终在该包的旧版本上运行,因为它尚未重新启动。所以,我的问题是,我们如何确定由于未重新启动而在该软件包的旧版本上运行的进程?
答案1
共享库 inode 在 中注册/proc/PID/maps
,即nginx
在 Fedora 36 上运行:
7f9190a00000-7f9190a9a000 r--p 00000000 103:04 794344 /usr/lib64/libstdc++.so.6.0.30
该文件的格式解释这里。
基本上第五个字段是索引节点号。更新库后,您必须遍历/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"
.