Я запускаю следующую команду во всех контейнерах 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?
Как я могу это исправить?
Попробуй это:
vzctl enter $VM --exec "apt-get update && apt-get upgrade"
&& означает «Если предыдущая команда завершилась успешно, переходите к следующей».
Из http://wiki.openvz.org/Man/vzctl.8:
команда exec CTID
Выполняет команду в контейнере. Переменные среды не устанавливаются внутри контейнера. Обработчики сигналов могут отличаться от настроек по умолчанию. Если команда -, команды читаются из стандартного ввода.
команда exec2 CTID
То же, что и exec, но код возврата - это команда.
С другой стороны
введите CTID [--exec command [arg ...]]
Входит в контейнер (давая корневую оболочку контейнера).
Опция --exec используется для запуска команды с аргументами после входа в контейнер. Это полезно, если для запуска команды требуется терминал
Не используйте эту идиому «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 для обновления, чтобы ответить «да» на любые вопросы, что полезно для таких автоматических обновлений, как это.