我在Ubuntu 22.04版服务器上,使用 “sudo apt install net-tools” 命令安装net-tools软件包时,系统弹出了一个以前从未出现过的,名为 “Daemons using outdated libraries” 的对话框,让我手动选择需要重启的services服务。
对话框如下所示:
第一次碰到这种情况,感到有些懵:为什么会出现这个对话框?如何选择?选择后会产生哪些影响?何时会出现类似的提示?原理是什么?
在探索之前,这里先简单说下,为什么会出现这个对话框。
- 首先这个是 Ubuntu 22.04 的新特性。
- 假如当前系统中有个 abc.service 服务,正在使用libxxx_1.0.so。
- 这时使用apt安装另外一个软件包,恰巧安装了libxxx_1.0.so的升级版本libxxx_2.0.so,后者是对前者安全漏洞的加固升级修复。
- 很显然,按最优逻辑,这个时候我们希望可以立即重启abc.service,从而使用新的安全动态库 libxxx_2.0.so。
- 目前 needrestart 是apt的一部分,由钩子触发 needrestart,needrestart会判断新版动态库影响哪些service,从而提醒我们重启它们。
- needrestart 默认的提醒方式为“interactive”,也就是交互式,所以系统弹出该对话框,让我们在对话框中自己选择。
禁止弹出的方法
本文我们试着探究该特性背后的原理,在弄明白之前,我们先禁止这个对话框的出现。
为什么要禁止?有一种情况是,我们在后台脚本执行流中可能有安装软件的地方,出现这个对话框又需要人工介入,会挂在这里,导致执行流终止。
第一种默认提醒方式修改方法:
修改 needrestart 的配置文件 /etc/needrestart/needrestart.conf,其对应配置项为 “ $nrconf{restart} = ‘i’”。
修改前如下图所示:
从上图注释可知,它有三种提醒方式:
- (l)ist only 仅仅列出需要重启的services
- (i)nteractive 弹出对话框,由用户手工选择,该项为默认值
- (a)utomatically 自动重启相关services
按最优逻辑,让 needrestart 帮我们自动重启,所以我们选择“(a)utomatically”。修改后保存,配置文件如下图所示:
第二种默认提醒方式修改方法:
使用如下命令,指定环境变量后进行apt安装:
1 | $ sudo NEEDRESTART_MODE=a apt-get dist-upgrade --yes |
但注意:这种方法只作用于本次操作,并非长久有效,如要长期设置,需按第一种方法修改配置文件。
参考网站
- https://medium.com/@nobuto_m/knowing-what-services-need-restart-with-needrestart-37419f44ed46
- https://stackoverflow.com/questions/73397110/how-to-stop-ubuntu-pop-up-daemons-using-outdated-libraries-when-using-apt-to-i
- https://askubuntu.com/questions/1367139/apt-get-upgrade-auto-restart-services
- https://manpages.ubuntu.com/manpages/jammy/man1/needrestart.1.html
- https://github.com/liske/needrestart