假设正在运行二进制可执行程序:
例如:ps -eaf | grep someServer
显示someServer正在运行.
是否可以判断磁盘上的某些Server可执行文件(例如/ usr/bin/someServer)是否与实际启动的程序匹配?
是:使用软链接/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将被清除.