apt-get 升级自动重启服务

jul*_*old 37 upgrade server updates apt services

我有一个用于安装服务器的无人值守脚本。在脚本的开头有一个sudo apt-get dist-upgrade --yes. dist 升级的最后有一个令人讨厌的用户输入屏幕,要求重新启动服务:
在此输入图像描述

是否可以自动接受服务重新启动或禁用此屏幕?它破坏了我的整个剧本。另外我担心它可能会让我的服务器在更新时卡在某个时刻......

与 apt-get Upgrade 的结果相同

编辑:我尝试过但没有成功:

#!/bin/bash
sudo apt-get update
sudo apt-get remove apt-listchanges --assume-yes --force-yes &&

#using export is important since some of the commands in the script will fire in a subshell
export DEBIAN_FRONTEND=noninteractive &&
export APT_LISTCHANGES_FRONTEND=none &&

#lib6c was an issue for me as it ignored the DEBIAN_FRONTEND environment variable and fired a prompt anyway. This should fix it
echo 'libc6 libraries/restart-without-asking boolean true' | debconf-set-selections &&

echo "executing wheezy to jessie" &&
find /etc/apt -name "*.list" | xargs sed -i '/^deb/s/wheezy/jessie/g' &&

echo "executing autoremove" &&
sudo apt-get -fuy --force-yes autoremove &&

echo "executing clean" &&
sudo apt-get --force-yes clean &&

echo "executing update" &&
sudo apt-get update &&

echo "executing upgrade" &&
sudo apt-get --force-yes -o Dpkg::Options::="--force-confold" --force-yes -o Dpkg::Options::="--force-confdef" -fuyq upgrade &&

echo "executing dist-upgrade" &&
sudo apt-get --force-yes -o Dpkg::Options::="--force-confold" --force-yes -o Dpkg::Options::="--force-confdef" -fuyq dist-upgrade
Run Code Online (Sandbox Code Playgroud)

Pow*_*iKi 38

其他答案完全跳过needrestart

但环境变量NEEDRESTART_MODE允许指定模式。通过选择“(a)自动”,您可以受益,needrestart而不会被提示阻止:

sudo NEEDRESTART_MODE=a apt-get dist-upgrade --yes
Run Code Online (Sandbox Code Playgroud)

  • 这不是一个永久的解决方案。相反,它是临时的,无需编辑任何配置文件。如果您想使其永久化,可以将其包装在自定义脚本中,或者查看其他编辑配置文件的解决方案。 (4认同)

小智 32

正如其他人提到的,这种情况下的问题在于命令needrestart,它是 Ubuntu 中 apt-get 升级过程的一部分(特别是我正在使用的 22.04)。默认情况下,它设置为“交互”模式,这会导致脚本中断。

要更改此行为,我们可以编辑该/etc/needrestart/needrestart.conf文件,更改以下行:

#$nrconf{restart} = 'i';

$nrconf{restart} = 'a';(如果我们想自动重新启动服务)或者 $nrconf{restart} = 'l';只是列出需要重新启动的服务。

如果您正在运行脚本并希望在不使用 vim 等交互式编辑器的情况下进行此编辑,您可以使用 来执行此操作sed,例如:

sudo sed -i 's/#$nrconf{restart} = '"'"'i'"'"';/$nrconf{restart} = '"'"'a'"'"';/g' /etc/needrestart/needrestart.conf

由于配置文件中的单引号以及 sed 处理单引号的方式,它看起来很难看,但它确实有效。如果您有更好看的方法,请发表评论。

  • 您可以用双引号代替“quote hell” sed: `sed -i "s/#\$nrconf{restart} = 'i';/\$nrconf{restart} = 'a';/" /etc /needrestart/needrestart.conf` (5认同)
  • 最简单的方法是(根据手册)将安装标志设置为非交互式。例如,DEBIAN_FRONTEND=noninteractive 所以在我的脚本中,我在开始时`export DEBIAN_FRONTEND=noninteractive`,它的行为“正常”,即它不要求输入 (4认同)

小智 8

Vardogor的答案对我有用,只是有一点点不同,一个破折号(-y)而不是两个破折号(--y):

sudo DEBIAN_FRONTEND=noninteractive apt-get dist-upgrade -y
Run Code Online (Sandbox Code Playgroud)

如果我使用两个破折号,则会出现此错误:

E: Command line option --y is not understood in combination with the other options
Run Code Online (Sandbox Code Playgroud)

我在 Ubuntu 22.04 LTS 上执行此操作

  • 在脚本开头更容易“export DEBIAN_FRONTEND=noninteractive” (2认同)

小智 8

不要使用 sed 或编辑主配置,而是在 /etc/needrestart/conf.d/no-prompt.conf 中添加您自己的配置文件:

$nrconf{restart} = 'a';
Run Code Online (Sandbox Code Playgroud)

  • 这是正确的答案。编辑软件包附带的配置有一天会导致升级冲突。 (2认同)

小智 7

或者,我认为您可以删除needrestart软件包本身。

sudo apt-get remove needrestart
Run Code Online (Sandbox Code Playgroud)

我将其用于 Ubuntu 22.04 上的 AWS EC2 配置。无论出于何种原因,export DEBIAN_FRONTEND=noninteractive似乎都不起作用。


tur*_*rbo 4

使用:

sudo NEEDRESTART_SUSPEND=1 apt-get dist-upgrade --yes
Run Code Online (Sandbox Code Playgroud)


Var*_*gor 0

尝试一下sudo DEBIAN_FRONTEND=noninteractive apt-get dist-upgrade --y,它应该可以阻止任何这些提示

  • 这并不能解决问题,我一直在使用这个,22.04 中的提示是不同的。尝试其他解决方案。 (2认同)