因此,我知道可以查看或恢复进程当前正在使用的已删除文件。我发现这也适用于更新过的包。因此,假设我们更新了一个包,但是该包仍然被另一个进程使用,并最终运行在该包的旧版本上,因为它尚未重新启动。因此,我的问题是,由于该包没有重新启动,我们如何确定在该包的旧版本上运行的进程?
发布于 2022-10-21 14:22:40
共享库inode是在/proc/PID/maps
中注册的,即运行在Fedora 36上的nginx
:
7f9190a00000-7f9190a9a000 r--p 00000000 103:04 794344 /usr/lib64/libstdc++.so.6.0.30
这里解释了该文件的格式。
基本上,第五个字段是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"
。
https://unix.stackexchange.com/questions/721949
复制