首页 > 解决方案 > 如何从Linux中的进程中分离可执行文件以进行实时更新

问题描述

通常,从该文件启动进程时,不能覆盖可执行文件。该进程可以随时尝试重新加载丢失的代码段。

是否有可能绕过/打破这个锁?

我的过程这样做了,mlockall()所以所有代码页都已经加载了。

目标是流程(一个长期运行的任务)应该在尽可能少的停机时间内自我更新。

下载后,execl(argv[0],NULL)应该激活更新的代码。

标签: clinuxprocess

解决方案


对我来说,你在几个方面是错误的:

  • 首先,您可以覆盖在 Linux 上运行的二进制文件(更具体地说,是文件存储在 ext{2,3,4} 文件系统上的二进制文件);原因很简单,只要在文件上仍然打开一个文件描述符,与该文件关联的 inode 就会由驱动程序保持“分配”,直到最后一个文件描述符在其上关闭,然后块被释放。因此不存在查找文件数据的风险。
  • 代码在内存中映射是进程启动,因此不会丢失代码(并且由于 mmap 使用文件描述符,即使在惰性映射的情况下,整个文件仍然是“可映射的”。
  • mlockall 用于锁定内存中的页面,从而防止交换,这与锁定文件系统上的文件关系不大。

最后,没有什么能阻止你做你所要求的。


推荐阅读