在 Linux 中,当正在运行的程序的可执行文件被修改或删除时会发生什么?

在 Linux 中,当正在运行的程序的可执行文件被修改或删除时会发生什么?

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

那些正在运行的 ruby​​ 进程会发生什么?

答案1

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

答案2

它们会继续运行。如果它们尝试访问自己并收到完全错误的信息,可能会严重崩溃。除非迫不得已,否则我不会这么做 :)

答案3

那些正在运行的 ruby​​ 进程会发生什么?

  1. 复制 /usr/local/bin/ruby
  2. [如果它没有运行,请运行 /usr/local/bin/ruby ]
  3. 尝试: rm /usr/local/bin/ruby
  4. 亲自看看吧:)

答案4

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

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

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

我的 RAID 控制器出了问题,导致装载根目录和其他分区的整个磁盘突然像断开连接一样。无法加载新程序,但内存中的程序运行正常,直到它们需要磁盘中的文件。

相关内容