我在所有 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 来表示升级,以便对任何问题回答“是”,这对于像这样的无人值守升级很有用。