假设正在运行二进制可执行程序:
例如: ps -eaf | grep someServer
显示someServer正在运行。
是否可以判断磁盘上的someServer可执行文件(例如/ usr / bin / someServer)是否与实际启动的程序匹配?
答案 0 :(得分:6)
是:使用软链接/proc/$pid/exe
获取用于加载代码的路径。
查看/proc/$pid/maps
。它看起来像这样(对于/sbin/getty
):
00400000-00407000 r-xp 00000000 08:01 3145779 /sbin/getty
00606000-00607000 r--p 00006000 08:01 3145779 /sbin/getty
00607000-00608000 rw-p 00007000 08:01 3145779 /sbin/getty
... lots more ...
使用您从软链接获得的路径过滤文件,以找到您感兴趣的行。
最后一个数字(3145779
)是文件的inode。在磁盘上创建新文件时,它会获得一个新的inode。
要查看文件的inode,请使用ls --inode /sbin/getty
:
3145779 /sbin/getty
由于这两个数字仍然相同,因此磁盘上的可执行文件与RAM中的可执行文件相同。
背景:Linux不会立即将进程加载到RAM中。相反,使用虚拟内存子系统将可执行文件内存映射到RAM中。这意味着您永远不会使用的部分可执行文件永远不会加载到内存中。这也意味着内核将磁盘上的可执行文件用作“缓存”。
覆盖磁盘上的可执行文件时,原始inode不会更改。您现有的流程依赖于它。而是创建一个新的inode,并更新目录节点(包含文件名和指向带有数据的inode的指针)。这就是为什么你可以覆盖当前在Linux上使用的文件。
当使用它的最后一个进程终止时,原始的inode将被清除。
答案 1 :(得分:1)
我不确定你到底是什么意思。
答案 2 :(得分:0)
如果您想知道某个特定的可执行索引节点是否产生了任何正在运行的进程:
# find -L /proc/[0-9]*/exe -samefile /usr/bin/someServer
此命令将输出/proc/<pid>/exe
个路径名的列表,每个路径的可执行映像都从与当前在/usr/bin/someServer
上链接的同一inode映射到内存的每个进程一个。
请注意,该命令将不查找从{em> 以前在/usr/bin/someServer
链接过但后来已取消链接的inode生成的进程,例如可执行文件的更新版本已替换了正在运行的版本。