软件更新程序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 进程复制自身,然后其中一个副本将成为正常的渲染进程。