OpenVZ exec 无法重新打开 stdin / 无法锁定管理目录

OpenVZ exec 无法重新打开 stdin / 无法锁定管理目录

我在所有 OpenVZ 容器上运行以下命令来更新/升级:

vzctl exec2 $VM "apt-get update & apt-get upgrade"

在所有情况下,我都会收到以下错误:

dpkg-preconfigure: unable to re-open stdin: No such file or directory

当有更新可用时,将跳过提示“是否要继续”。此外,dpkg 无法设置锁定:

E: Could not get lock /var/lib/dpkg/lock - open (11: Resource temporarily unavailable)
E: Unable to lock the administration directory (/var/lib/dpkg/), is another process using it?

我怎样才能解决这个问题?

答案1

尝试这个:

vzctl enter $VM --exec "apt-get update && apt-get upgrade"

&& 的意思是“如果前一个命令成功完成,则继续执行下一个命令。”

http://wiki.openvz.org/Man/vzctl.8

执行 CTID 命令

在容器中执行命令。容器内未设置环境变量。信号处理程序可能与默认设置不同。如果命令为 -,则从标准输入读取命令。

exec2 CTID 命令

与 exec 相同,但返回代码是命令的代码。

另一方面

输入 CTID [--exec 命令 [arg ...]]

进入容器(给出容器的根 shell)。

选项 --exec 用于在进入容器后运行带参数的命令。如果要运行的命令需要终端,则这很有用

答案2

不要使用这个习语“apt-get update & apt-get upgrade”,因为升级会与更新同时进行,这会导致更新锁定数据库,升级失败。

以下说法之一是正确的:

vzctl 输入 $VM --exec "apt-get update && apt-get -y upgrade" [注:编辑了上面 Javix 的答案]

或者

vzctl 输入 $VM --exec "apt-get update; apt-get -y upgrade"

在第一个命令中,只有更新成功后才会继续升级。在第二个命令中,无论如何都会尝试升级。

对于每一个,我还添加了一个 -y 来表示升级,以便对任何问题回答“是”,这对于像这样的无人值守升级很有用。

相关内容