如果我不小心使某个应用程序运行并在Software Updater中单击“立即安装”,该怎么办?


22

例如,软件更新程序会update-manager弹出并显示Firefox的安全更新。自然,我将单击“立即安装”继续。

但是,如果我仍在运行Firefox,该怎么办?还会更新Firefox吗?是否会跳过更新并仅在下次再次弹出?此更新会迫使Firefox关闭并可能崩溃吗?它会仅部分更新软件并可能破坏我的Firefox安装吗?


10
没事,Firefox在Ram中打开。有时它会检测到更新并告诉您重新启动浏览器。但是也许有更多洞察力和参考资料的人可以给出更好的答案。
pLumo

3
我不特别了解Ubuntu,但是在Arch(在这种情况下,我认为它并没有什么不同),在运行时更新Firefox下的Firefox 似乎是可行的,但是在Firefox中做的第一件事就是崩溃事情。我一直将其归因于现代浏览器的复杂性,即在运行时加载各种内容。但是Firefox对我来说是唯一发生的事情。
tommmeding

2
下次打开选项卡时,Firefox将停止,并告诉您需要重新启动。其他应用可能会有所不同。
迈克尔·汉普顿

Answers:


40

您一定在考虑Windows。Unix做得对,后来Windows出现并开发了错误的处理方式。

使用Windows,替换正在运行的进程正在使用的文件会严重影响该进程。该过程将引用该文件中的位置,并从文件中获取不正确的信息,通常会导致灾难性的结果。这就是Windows更新通常要求重新启动以确保所有进程都使用正确版本的库等的原因。

在Unix中,一旦进程打开了一个文件,即使从文件系统中删除了原始文件,该文件也始终对进程可用。

更新后,文件系统将包含该文件的不同版本,并且更新后启动的所有进程都将使用该新文件。但是,与Windows不同,所有旧的Unix进程将继续使用它们最初使用的原始文件。即使不再可以通过文件系统访问,只要任何进程正在使用它们,这些文件都将保留。最终,当没有进程使用文件时,文件的旧版本将最终被删除。

如果您想立即获得更新的好处,您当然可以决定重新启动Firefox(或其他进程)。这是你的选择。


评论不作进一步讨论;此对话已转移至聊天
托马斯·沃德

18

通常,在程序已经打开时更新程序是没有问题的-正如其他答复者所解释的,即使删除了可执行文件,正在运行的进程也可以继续运行。

但是,由于Firefox的多进程模型,无论如何更新后,您可能会提示您重新启动它。这是因为 Firefox产生了新的进程来隔离不同的网站,因此,如果在更新后但重新启动Firefox之前产生了新的进程,则新进程将是比其他浏览器新的Firefox版本。这可能会导致各种问题,因此Firefox可能会提示您重新启动它,然后再允许您继续。

顺便说一句,Chrome 通过使用无所事事的“合子”过程来避免这种情况。当浏览器需要产生一个新进程时,而不是要求操作系统再次执行浏览器可执行文件(它将执行可能已更新的二进制文件),而是要求合子进程自我复制,然后其中一个副本成为普通的渲染器。处理。


1
另外,对于像Firefox这样的复杂应用程序,程序启动时可能需要处理的所有内容都不会加载到内存中。因此,根据需要加载的组件可能会类似地导致版本不匹配。我经常在运行时更新Firefox时挂起。
fixer1234

这不仅是具有多进程模型的浏览器,还包括在IPC中使用库并且可以在更新之前和之后加载库的任何情况-尽管浏览器可能是当今最著名的示例(Windows上的COM互操作正在相当普遍的意思是,虽然更多的程序可以隐式地执行类似的操作)。我也无法想象Chrome完全避免了合子过程的问题-它真的会在启动时随时加载它可能需要的每个库吗?
Voo

@Voo询问“它是否真的在启动时随时加载它可能需要的每个库?”。我不知道这个特定的例子,但是总的来说没有必要。所需要做的就是确保在启动时打开每个可能的库,从而保证在需要时将读取正确的数据。与加载文件包含的所有内容相比,打开一个文件(或数十个文件)是微不足道的开销。
雷·巴特沃思

@Ray有趣的事实:dlopen只接受一个文件名,而不接受文件描述符,因此它可能不像您想象的那么简单(您可以使用/ proc,但在* nixes上却有很大不同)。但是更大的问题是,这将消除大多数使用动态加载开始的用例。
Voo

@Voo,对不起,我错误地认为此评论是在面向Unix的线程中进行的,而不是关于Windows和dll的。
雷·巴特沃思
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.