![如果我意外让某个应用程序保持运行并在软件更新程序中单击“立即安装”,会发生什么情况?](https://linux22.com/image/911434/%E5%A6%82%E6%9E%9C%E6%88%91%E6%84%8F%E5%A4%96%E8%AE%A9%E6%9F%90%E4%B8%AA%E5%BA%94%E7%94%A8%E7%A8%8B%E5%BA%8F%E4%BF%9D%E6%8C%81%E8%BF%90%E8%A1%8C%E5%B9%B6%E5%9C%A8%E8%BD%AF%E4%BB%B6%E6%9B%B4%E6%96%B0%E7%A8%8B%E5%BA%8F%E4%B8%AD%E5%8D%95%E5%87%BB%E2%80%9C%E7%AB%8B%E5%8D%B3%E5%AE%89%E8%A3%85%E2%80%9D%EF%BC%8C%E4%BC%9A%E5%8F%91%E7%94%9F%E4%BB%80%E4%B9%88%E6%83%85%E5%86%B5%EF%BC%9F.png)
软件更新程序update-manager
会弹出并显示 Firefox 的安全更新。当然,我会点击“立即安装”继续。
但是,如果我执行此操作时 Firefox 仍在运行,会发生什么情况?它还会更新 Firefox 吗?更新会被跳过,下次再弹出吗?更新会强制 Firefox 关闭并崩溃吗?它只会部分更新软件并可能破坏我的 Firefox 安装吗?
答案1
您一定想到了 Windows。Unix 做对了,但后来 Windows 出现了,并发展出了错误的做事方式。
对于 Windows,替换正在运行的进程正在使用的文件可能会严重影响该进程。该进程将引用该文件中的位置并从中获取错误的信息,通常会带来灾难性的后果。这就是为什么 Windows 更新通常需要重新启动以确保所有进程都使用正确版本的库等。
在 Unix 中,一旦某个文件被某个进程打开,则该文件将始终可供该进程使用即使原始文件已从文件系统中删除。
更新后,文件系统将包含文件的不同版本,更新后启动的所有进程都将使用新文件。但与 Windows 不同,所有旧 Unix 进程将继续使用它们启动时的原始文件。即使无法再通过文件系统访问,只要有任何进程正在使用它们,这些文件就会保留下来。最终,当没有进程正在使用这些文件时,旧版本的文件将被删除。
当然,如果您想立即获得更新的好处,您可以决定重新启动 Firefox(或其他进程)。选择权在您手中。
答案2
通常情况下,在程序已经打开时更新程序是没有问题的——正如其他答复者所解释的那样,即使可执行文件被删除,正在运行的进程仍可继续运行。
但是,由于 Firefox 的多进程模型,更新后你仍然可能会收到重新启动的提示。这是因为Firefox 会生成新进程来隔离不同的网站,因此如果它在您更新 Firefox 之后但在重新启动 Firefox 之前生成新进程,则新进程将是比浏览器其余部分更新的 Firefox 版本。这可能会导致各种问题,因此 Firefox 可能会提示您重新启动它,然后才允许您继续。
顺便说一下,Chrome避免这种情况通过使用一个处于闲置状态的“zygote”进程;当浏览器需要生成新进程时,它不是要求操作系统再次执行浏览器可执行文件(这将执行可能已更新的二进制文件),而是要求 zygote 进程复制自身,然后其中一个副本将成为正常的渲染进程。