如何确定哪些进程正在过时的软件包上运行并且需要重新启动?

如何确定哪些进程正在过时的软件包上运行并且需要重新启动?

因此,我知道可以查看或恢复进程当前正在使用的已删除文件。我发现这也适用于更新的软件包。因此,假设我们更新了一个包,但该包仍在被另一个进程使用,并且最终在该包的旧版本上运行,因为它尚未重新启动。所以,我的问题是,我们如何确定由于未重新启动而在该软件包的旧版本上运行的进程?

答案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/filestat --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".

相关内容