弹出“守护进程使用过时的库”“哪些服务应该重新启动?”破坏了我的脚本,因为它无法与之交互,需要我中断。当我使用 apt 安装或更新软件包(在脚本中或直接在 shell 中)时会发生这种情况。该脚本会安装一堆软件和软件包。这是一个例子:
我已经在多个不同的 shell 和设备上尝试过此操作。我的Ubuntu版本是20.04。
它不注册 Enter/Return,任何键盘输入(例如向下箭头)都会执行以下操作:
我不知道为什么会发生这种情况,我想知道如何防止它像这样破裂(或者只是完全防止弹出窗口)。
以下是脚本中的一些可能相关的行(包括我在开头添加的一些内容以尝试解决问题):
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
由钩子调用;这里两个相关的钩子是 itapt
和dpkg
hooks。通过将环境变量设置为非空值,apt
可以暂时禁用该挂钩。NEEDRESTART_SUSPEND
该dpkg
挂钩不可配置,但可以通过重命名来禁用它。
还值得注意的是,NEEDRESTART_MODE
环境变量可用于覆盖模式配置设置(而不是修改配置文件)。
我建议采用以下方法:
needrestart
从脚本中删除所有调整。设置
NEEDRESTART_SUSPEND
为非空值并将其导出:export NEEDRESTART_SUSPEND=1
设置
NEEDRESTART_MODE
为“自动”或“列表”:export NEEDRESTART_MODE=l
如果上述还不够,请禁用该
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
在脚本末尾显式运行。