为什么apt-get不需要重新启动,而更新管理器需要重新启动?

很多时候,我试图通过打开控制台并输入一系列命令来“击败”更新管理器。
sudo apt-get update
sudo apt-get upgrade

根据我所知,这个命令应该会将所有软件包更新到最新的稳定版本。就我所知,更新管理器也是一样的。
然而,更新管理器有时候(尤其是在分发新内核时)需要在终止后重新启动。而apt-get则从不需要重新启动,即使看起来我正在升级内核。为什么会这样呢?
针对重复投票的回应:我并不是像链接的问题所问的那样,询问哪些软件包需要重新启动。相反,我想知道为什么即使我意识到有一个正在更新的软件包可能需要重新启动,但apt-get也没有让我重新启动。

10值得注意的是,apt-get dist-upgrade 覆盖的更新类型,而 apt-get upgrade 不覆盖的更新类型更有可能是那些会导致更新管理器建议重新启动的更新。 - Jon Hanna
5顺便说一句,你可以通过检查/var/run/reboot-required文件的存在来确定是否需要重新启动。此外,当需要更新时,Byobu会在状态栏中显示一个“需要更新”的图标。 - Andrea Corbellini
请注意,“需要更新”并不是一个看似微不足道的问题。例如,如果升级修复了登录界面(gdm/lightdm/...)的故障,您是否需要重新启动?这个例子对于服务器来说听起来很有趣,对于普通桌面来说可能有些疯狂,但对于使用频繁的终端来说就没那么简单了。这实际上取决于您如何使用系统,而这是没有任何脚本可以真正知道的。 - Alois Mahdal
可能是如何知道哪个软件包需要重新启动系统?的重复问题。 - Pilot6
2@Pilot6 这根本不是重复的问题。你标记的那个问题是在询问哪些软件包需要重新启动。而我的问题是问为什么一个更新方法没有要求我重新启动,尽管我意识到有一个需要重新启动的软件包正在被更新。 - Jan
1好的。但它是密切相关的。 - Pilot6
1@Pilot6 我可以同意这个 ;) - Jan
5个回答

因为apt-get(或者简单的apt)是给专业人士使用的,当专业人士执行以下操作时:
sudo apt-get dist-upgrade

看到新的内核被安装后,专业人士都知道他们必须重新启动以激活它。
自动更新是给其他人使用的!
或者,你现在可以从16.04版本开始安装Ubuntu Live内核补丁,这样可以在服务器运行时更新内核。
:-)

4我希望我能接受这三个答案,因为从技术上讲它们都表达了同样的意思。但是我想我会选择你的,因为你让我笑得最开心 ;-) - Jan
6在回答中加入一点幽默从来都不是坏事!;-) - Fabby
4内核实时补丁支持现在已经在主流内核中,所以有一点运气的话,一旦我们到达LTS 16.04,就不必再重新启动了。 - kasperd
你对apt-get upgradeapt-get dist-upgrade的描述既不符合man apt-get的说明,也不符合我使用这个工具的经验。我相当确定它们之间的区别与处理可能需要安装或删除软件包的依赖有关;"upgrade"跳过这些软件包,而"dist-upgrade"则尝试安装/删除软件包以完成升级。 - derobert
@derobert:阅读了说明书,没有找到任何与我所说的相矛盾的内容,这只是我的经验,但可能是因为我的系统问题...所以如果你有反面证据的话,我会再次删除! - Fabby
1@Fabby,我有点困惑,因为您目前已经删除了那段文字,但是如果您查看apt-get的手册页面,"upgrade"的描述中说到,例如:"绝对不会删除当前已安装的软件包,也不会获取和安装尚未安装的软件包。"所以,如果普通应用程序更新需要安装一个新的软件包(例如新的库soname),那么它将不会被执行。或者如果内核更新使用了相同的软件包名称,那么它将会被执行。 - derobert
@Fabby,你所描述的行为通常是有效的,因为Ubuntu在每个新内核版本中使用了一个新的软件包名称,而应用程序的安全更新通常不需要安装新的软件包。 - derobert
@Fabby 很不幸,当然也可能会有例外情况——如果你理解"升级"意味着"不包括内核",而"全面升级"意味着"包括内核",那么这将是非常令人惊讶的。 - derobert

更新管理器建议在内核升级或其他标记为升级时需要重新启动的系统包服务时重新启动。
在这种情况下,/var/run/reboot-required是由软件包安装脚本设置的。
命令行apt-get upgrade不会提出任何建议,因为它面向更高级的用户,他们可以自行决定何时重新启动系统 ;-)
但是,在使用apt-get Update Manager进行升级后,过一段时间后也会建议重新启动。

我简直不敢相信,这是真的吗?“无法在不重新启动整个系统的情况下重新启动的服务。” - A.B.
2是的,这是真的。像“新贵”和其他一些词汇一样。但并不多。 - Pilot6
2@Pilot6 如果一个新手无法在不重启的情况下重新启动,听起来很荒谬。它本应是SysV init的升级版本,而后者可以在不重启的情况下重新启动。 - kasperd
@kasperd 那只是一个例子。我注意到更新管理器要求重新启动一些非内核软件包。肯定有一些这些软件包的列表。我不太确定upstart是否在其中。 - Pilot6
但是在运行apt-get upgrade之后,用户会知道标记为重新启动的软件包是否已经升级吗?无论用户是否使用命令行,这似乎都是对用户有用的信息。 - Max Nanasy
1@MaxNanasy 更新管理器将弹出并建议重新启动。可能会在一段时间内发生。 - Pilot6
@kasperd 缺乏重新启动突然成为评判软件的唯一维度了吗?完全有可能在整体升级的同时,在某些方面出现退步。 - Chris Hayes
如果你使用类似Ksplice这样的工具,就不需要重新启动了。Ksplice对于Ubuntu和Fedora桌面版是免费的。 - Paddy Landau
FYI,当升级需要重新启动时,软件包会设置/var/run/reboot-required。请参考http://serverfault.com/questions/92932/how-does-ubuntu-keep-track-of-the-system-restart-required-flag-in-motd。 - ayke

当你安装一个新内核时,你必须重新启动机器才能使更改生效,apt-get只是不会对此提醒。

1不仅仅是内核更新。当某些其他软件包升级时,您还需要重新启动或重启一些服务。如果您很懂行,通常可以重新启动相关服务并避免重新启动系统。如果您不懂,那么重新启动系统总是有效的。确定哪些服务需要重新启动通常并不简单,因为升级的软件包可能涉及到许多其他软件直接或间接依赖的共享库。我也不完全相信图形化的更新管理器能够知道这些情况。 - thomasrutter

apt-get在安装某个软件包后,如果需要重新启动,实际上会在终端上通知你。 update-manager是一种全能型解决方案,可以自行处理所有升级需求。
我更喜欢apt-get,不知道为什么 :)

apt-get upgrade 不会更新内核。

apt-get dist-upgrade 在Ubuntu中更新内核。

Linux内核版本在4.1之前的需要在更新内核后重新启动。

其他软件包不需要重新启动,只需要重新启动应用程序本身。 一些在Wine上运行的Windows应用程序可能会要求重新启动,但只需输入以下命令:

wineserver -k

重新启动应用程序。