Вопрос или проблема
Я выполняю несогласованную / неинтерактивную установку пакетов с помощью
DEBIAN_FRONTEND=noninteractive apt-get install -y my_package
Это работает как ожидалось в большинстве случаев, но все же предлагает интерактивный запрос, если возникает конфликт конфигурационного файла, например, что-то вроде этого:
Конфигурационный файл '/etc/foo'
==> Изменен (вами или скриптом) с момента установки.
==> Дистрибьютор пакета выпустил обновленную версию.
Что вы хотите с этим сделать? Ваши варианты:
Y или I : установить версию, предложенную обслуживанием пакета
N или O : оставить вашу установленную версию
D : показать различия между версиями
Z : запустить оболочку для изучения ситуации
Я знаю, что могу выбрать ответ на это, передав подходящий dpkg
параметр в apt-get
через -o
, например:
DEBIAN_FRONTEND=noninteractive apt-get -o DPkg::Options::=--force-confdef install -y my_package
Однако соответствующие опции, предлагаемые dpkg
, похоже, не включают способ прервать установку при возникновении конфликта, что мне нужно.
Как я могу неинтерактивно установить пакет через apt-get
и завершить выполнение, если возникает конфликт конфигурации?
apt-get
, будет ли конфликт--confold
), но затем выйти с ненулевым кодом или иметь другой способ обнаружения этого позже.Я не проверял это в вашем сценарии, но dpkg
должен прервать выполнение, если ему нужно запрашивать информацию и он не может читать стандартный ввод; так что
DEBIAN_FRONTEND=noninteractive apt-get install -y my_package < /dev/null
должно завершиться с ошибкой, если возникнет конфликт в конфигурационном файле.
Если это не сработает, вы всегда можете поискать остатки от конфликтов: в зависимости от ваших параметров --conf
dpkg
либо оставит старую версию с суффиксом .dpkg-old
, либо новую версию с суффиксом .dpkg-new
. Таким образом, вы можете искать новые .dpkg-*
файлы в /etc
после попытки установки, чтобы определить, были ли какие-либо конфликты.
Ответ или решение
Для того чтобы принудить apt-get install
в неинтерактивном режиме завершаться с ошибкой при наличии конфликта конфигурационных файлов, можно применять несколько методов. Ваша задача заключается в том, чтобы наладить автоматизированный процесс установки пакетов, при этом избегая ситуации, когда процесс установки останавливается из-за необходимости выбора действия при конфликте конфигурационного файла.
Использование стандартного подхода с redirection
Первый метод, который вы можете использовать, включает перенаправление стандартного ввода. Команда следующего вида:
DEBIAN_FRONTEND=noninteractive apt-get install -y my_package < /dev/null
Этот подход позволяет dpkg
завершить установку с ошибкой, если он не может прочитать ввод. Это происходит потому, что dpkg
требует пользовательского ввода в случае конфликта конфигурационных файлов, и если ввода нет, процесс установки прерывается, что сопровождается соответствующим выходным кодом.
Настройка параметров apt-get
Можно также использовать параметры dpkg
для установки поведения, которое завершает установку, если возникают конфликты. Параметры --force-confdef
и --force-confold
позволяют контролировать, как обрабатываются конфликты:
DEBIAN_FRONTEND=noninteractive apt-get -o DPkg::Options::="--force-confdef" -o DPkg::Options::="--force-confold" install -y my_package
Модифицируя эти параметры, вы можете обеспечить, чтобы старая версия конфигурационного файла была сохранена, а новая версия не была принята без явного согласия (или наоборот). Если вы хотите, чтобы установка всегда завершалась с ошибкой при возникновении конфликта, вам придется мониторить состояние конфигурационных файлов после выполнения этих команд.
Проверка наличия конфликтов перед установкой
Для того чтобы проверить наличие конфликтов перед установкой, вы можете использовать команду dpkg
с опцией --status
для пакета, который вы собираетесь установить. Это позволит выявить, какие конфигурационные файлы уже установлены, и заранее определить возможные конфликты.
dpkg --status my_package
Также, можно создать небольшой скрипт, который проверяет наличие конфигурационных файлов с помощью команды:
find /etc -name '*.dpkg-old' -o -name '*.dpkg-new'
Эта команда позволит выявить потенциальные конфликты до установки. Если такие файлы найдены, установка может быть отменена или обработана по другому сценарию.
Обработка статуса установки
После выполнения команды apt-get
вы можете проверить её статус с помощью следующей конструкции:
if [ $? -ne 0 ]; then
echo "Ошибка при установке пакета. Проверьте конфликты конфигурационных файлов."
exit 1
fi
Это позволит отследить ошибки, возникшие во время установки, и принимать соответствующие меры.
Заключение
При помощи сочетания правильного управления вводом, настройками параметров dpkg
, проверки конфигураций перед установкой и обработки статусов выполнения команд вы сможете добиться нужного поведения при установке пакетов в неинтерактивном режиме. Это не только обеспечит автоматизацию процессов, но и повысит стабильность вашей системы при развертывании новых пакетов.