在linux中,如果正在运行的程序的可执行文件被修改或删除,将会发生什么?


12

假设/usr/local/bin/ruby它在后台运行,然后我们ruby用另一个版本覆盖,甚至删除ruby

那些运行红宝石流程的人将会怎样?

Answers:


10

这完全取决于可执行文件的更新方式。如果打开同一个文件并更改了部分文件,则将发生不良情况。如果删除了该文件,则从文件系统的目录结构中删除该文件,但实际上并没有取消链接(即删除),直到最后一个打开它的进程执行了它才退出。因此,如果删除了可执行文件,并在其位置写了一个具有相同名称的新文件,则旧文件应继续正常运行。


“如果打开了相同的文件,并且部分更改了”,则不等于“如果删除了可执行文件,并在其位置写了一个具有相同名称的新文件,则不等于”。您是说将mv新文件转换为旧文件是错误的,但是rm旧文件然后cp新文件转换为旧文件的位置是可以的吗?
吉恩

4

他们会继续前进。如果他们尝试访问自己并收到完全错误的信息,则可能会崩溃。除非必须,否则我不会这样做:)


是的 我始终在脚本运行时手动更新软件。
约翰T

1
对于脚本,重要的是要有实际的最新解释器,它们可以与最初打开的文件描述符一起使用。在这种情况下,只要您替换文件而不更改它就可以。对于二进制文件,它们通常在初始映射的FD上工作,因此没有问题(除非您修改文件)。但是可能会有一些应用程序打开文件名进行检查,并且可能会有风险(但是我不能给出任何负面的例子)。大多数Linux发行版/程序包管理器都假设可以(在有限的时间内)替换二进制文件和库是可行的。
eckes

1

那些运行红宝石流程的人将会怎样?

  1. 制作/ usr / local / bin / ruby​​的副本
  2. [如果未运行,请运行/ usr / local / bin / ruby​​]
  3. 尝试:rm / usr / local / bin / ruby
  4. 自己看看:)

1

据我了解,Linux内核具有一个称为加载程序的组件,该组件在加载/链接过程中会打开包含映像的可执行文件本身,并且一旦链接到库等后,加载程序便会关闭文件。因此,此过程将在内核实际启动该过程时发生并完成。

我不确定如果以后可执行文件尝试导入外部库,是否需要引用磁盘上的原始可执行文件。

我会说,根据我的经验,如果删除磁盘上的可执行文件,内存中加载的可执行文件不会受到影响。同样,如果将可执行文件替换为较新的版本,则当前执行的文件不会“自动”更新,除非它们被暂停并重新启动。

我遇到RAID控制器问题,该问题导致安装了根目录和其他分区的整个磁盘突然好像断开了连接。无法加载新程序,但是内存中的程序可以正常工作,直到需要磁盘中的文件为止。


听起来效率不高。我认为Windows会改为对其进行内存映射,因此可以按需加载页面。
sashoalm 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.