0%
包管理分析#003#Ubuntu停止弹出“Daemons using outdated libraries”对话框的方法

我在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

但注意:这种方法只作用于本次操作,并非长久有效,如要长期设置,需按第一种方法修改配置文件。

参考网站