![在 Linux 中,当正在运行的程序的可执行文件被修改或删除时会发生什么?](https://linux22.com/image/1227470/%E5%9C%A8%20Linux%20%E4%B8%AD%EF%BC%8C%E5%BD%93%E6%AD%A3%E5%9C%A8%E8%BF%90%E8%A1%8C%E7%9A%84%E7%A8%8B%E5%BA%8F%E7%9A%84%E5%8F%AF%E6%89%A7%E8%A1%8C%E6%96%87%E4%BB%B6%E8%A2%AB%E4%BF%AE%E6%94%B9%E6%88%96%E5%88%A0%E9%99%A4%E6%97%B6%E4%BC%9A%E5%8F%91%E7%94%9F%E4%BB%80%E4%B9%88%EF%BC%9F.png)
假设/usr/local/bin/ruby
它在后台运行,然后我们ruby
用不同的版本覆盖,甚至删除ruby
。
那些正在运行的 ruby 进程会发生什么?
答案1
这取决于可执行文件的具体更新方式。如果打开同一个文件,并且更改了其中的部分内容,则会发生不好的事情。如果删除了该文件,则会从文件系统的目录结构中删除该文件,但实际上并没有取消链接(即删除),直到最后一个打开该文件的进程执行完它并退出。因此,如果删除了可执行文件,并在其位置写入一个同名的新文件,则旧文件应该可以继续正常工作。
答案2
它们会继续运行。如果它们尝试访问自己并收到完全错误的信息,可能会严重崩溃。除非迫不得已,否则我不会这么做 :)
答案3
那些正在运行的 ruby 进程会发生什么?
- 复制 /usr/local/bin/ruby
- [如果它没有运行,请运行 /usr/local/bin/ruby ]
- 尝试: rm /usr/local/bin/ruby
- 亲自看看吧:)
答案4
据我了解,Linux 内核有一个称为加载器的组件,它在加载/链接过程中打开包含映像的可执行文件本身,一旦完成链接到库等,加载器就会关闭该文件。因此,这个过程在内核实际启动该过程时发生并完成。
如果可执行文件稍后尝试导入外部库,我不确定是否需要引用磁盘上的原始可执行文件。
我想说的是,根据我的经验,如果您删除磁盘上的可执行文件,则加载到内存中的可执行文件不会受到影响。同样,如果可执行文件被替换为较新的版本,则当前正在执行的文件不会“自动”更新,除非它们被暂停并重新启动。
我的 RAID 控制器出了问题,导致装载根目录和其他分区的整个磁盘突然像断开连接一样。无法加载新程序,但内存中的程序运行正常,直到它们需要磁盘中的文件。