弹出窗口无法与以下内容交互:​​“使用过时库的守护进程”“应重新启动哪些服务?”

弹出窗口无法与以下内容交互:​​“使用过时库的守护进程”“应重新启动哪些服务?”

弹出“守护进程使用过时的库”“哪些服务应该重新启动?”破坏了我的脚本,因为它无法与之交互,需要我中断。当我使用 apt 安装或更新软件包(在脚本中或直接在 shell 中)时会发生这种情况。该脚本会安装一堆软件和软件包。这是一个例子:

在此输入图像描述

我已经在多个不同的 shell 和设备上尝试过此操作。我的Ubuntu版本是20.04。

它不注册 Enter/Return,任何键盘输入(例如向下箭头)都会执行以下操作:

在此输入图像描述

我不知道为什么会发生这种情况,我想知道如何防止它像这样破裂(或者只是完全防止弹出窗口)。

我安装了 iTerm 但这并没有改变行为: 在此输入图像描述

以下是脚本中的一些可能相关的行(包括我在开头添加的一些内容以尝试解决问题):

echo '* libraries/restart-without-asking boolean true' | sudo debconf-set-selections

# Set noninteractive frontend for apt-get to avoid prompts
export DEBIAN_FRONTEND=noninteractive

# Define the file path
FILE_PATH="/etc/needrestart/needrestart.conf"

# Check if the file exists
if [ -f "$FILE_PATH" ]; then
    # Use sed to replace 'i' with 'a' for the specific configuration
    sudo sed -i "s/\$nrconf{restart} = 'i';/\$nrconf{restart} = 'a';/g" "$FILE_PATH"
    
    echo "The file has been updated successfully."
else
    echo "The specified file does not exist."
fi

sudo dpkg-reconfigure -f noninteractive needrestart

sudo systemctl restart needrestart.service
echo '* libraries/restart-without-asking boolean true' | sudo debconf-set-selections
echo 'needrestart needrestart/restart-services boolean true' | sudo debconf-set-selections

# Update the package list and install dependencies
sudo apt-get update && \
sudo apt-get install apt-transport-https ca-certificates curl software-properties-common -y

# Set timezone
ln -fs /usr/share/zoneinfo/America/New_York /etc/localtime && \
apt-get update && \
apt-get install -y tzdata && \
dpkg-reconfigure --frontend noninteractive tzdata

# Set environment variable for timezone
export TZ=America/New_York

# Attempt to install locales and generate en_US.UTF-8
apt-get update && \
apt-get install -y locales && \
locale-gen en_US.UTF-8

# Update packages, fix installations, install sudo, cleanup
apt-get update && \
apt-get install -f && \
apt-get install -y --no-install-recommends sudo && \
apt-get clean && \
rm -rf /var/lib/apt/lists/*

答案1

您提到的特定弹出窗口是由needrestart(我想您已经知道,因为您的脚本配置了它)生成的。

needrestart由钩子调用;这里两个相关的钩子是 itaptdpkghooks。通过将环境变量设置为非空值,apt可以暂时禁用该挂钩。NEEDRESTART_SUSPENDdpkg挂钩不可配置,但可以通过重命名来禁用它。

还值得注意的是,NEEDRESTART_MODE环境变量可用于覆盖模式配置设置(而不是修改配置文件)。

我建议采用以下方法:

  1. needrestart从脚本中删除所有调整。

  2. 设置NEEDRESTART_SUSPEND为非空值并将其导出:

    export NEEDRESTART_SUSPEND=1
    
  3. 设置NEEDRESTART_MODE为“自动”或“列表”:

    export NEEDRESTART_MODE=l
    
  4. 如果上述还不够,请禁用该dpkg钩子;在脚本的开头,

    [ -f /etc/dpkg/dpkg.cfg.d/needrestart ] && mv /etc/dpkg/dpkg.cfg.d/needrestart /etc/dpkg/dpkg.cfg.d/needrestart.disabled
    

    在最后(或在出口陷阱中),

    [ -f /etc/dpkg/dpkg.cfg.d/needrestart.disabled ] && mv /etc/dpkg/dpkg.cfg.d/needrestart.disabled /etc/dpkg/dpkg.cfg.d/needrestart
    

如果您想使用过时的库重新启动守护程序,您可能需要needrestart在脚本末尾显式运行。

相关内容