有没有办法在linux中告诉运行的二进制程序是否匹配磁盘上的文件?

ste*_*km3 4 linux

假设正在运行二进制可执行程序:

例如:ps -eaf | grep someServer

显示someServer正在运行.

是否可以判断磁盘上的某些Server可执行文件(例如/ usr/bin/someServer)是否与实际启动的程序匹配?

Aar*_*lla 6

是:使用软链接/proc/$pid/exe获取用于加载代码的路径.

看看/proc/$pid/maps.它看起来像这样(for /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 ...
Run Code Online (Sandbox Code Playgroud)

使用从软链接获得的路径过滤文件,以查找对您感兴趣的行.

最后一个数字(3145779)是文件的inode.在磁盘上创建新文件时,它会获得一个新的inode.

要查看文件的inode,请使用ls --inode /sbin/getty:

3145779 /sbin/getty
Run Code Online (Sandbox Code Playgroud)

由于这两个数字仍然相同,因此磁盘上的可执行文件与RAM中的可执行文件相同.

背景:Linux不会立即将进程加载到RAM中.相反,使用虚拟内存子系统将可执行文件内存映射到RAM中.这意味着您永远不会使用的部分可执行文件永远不会加载到内存中.这也意味着内核将磁盘上的可执行文件用作"缓存".

覆盖磁盘上的可执行文件时,原始inode不会更改.您现有的流程依赖于它.而是创建一个新的inode,并更新目录节点(包含文件名和指向带有数据的inode的指针).这就是您可以覆盖当前在Linux上使用的文件的原因.

当最后一个使用它的进程死掉时,原始的inode将被清除.