Невозможно заставить Debian выполнить автоматическую установку... libc6 хочет интерактивное подтверждение

Я пытаюсь создать сценарий, который вынуждает установку Debian Lenny установить последнюю версию CRAN R. Во время установки оказывается, что libc6 обновлен, и при установке требуется интерактивное подтверждение, что все в порядке для перезапуска трех служб (mysql, exim4, cron). Этот процесс ДОЛЖЕН быть без присмотра, поскольку он выполняется на машинах Amazon Elastic Map Reduce (EMR). Но у меня заканчиваются варианты. Вот несколько вещей, которые я пробовал:

Этот предыдущий вопрос, кажется, именно то, что я ищу. Поэтому я установил свой скрипт установки следующим образом:

# set my CRAN repos... yes, I know there's a new convention where to put these. 
echo "deb http://cran.r-project.org/bin/linux/debian lenny-cran/" | sudo tee -a /etc/apt/sources.list
echo "deb-src http://cran.r-project.org/bin/linux/debian lenny-cran/" | sudo tee -a /etc/apt/sources.list

# set the dpkg.cfg options per the previous SuperUser question
echo "force-confold" | sudo tee -a  /etc/dpkg/dpkg.cfg
echo "force-confdef" | sudo tee -a  /etc/dpkg/dpkg.cfg
export DEBIAN_FRONTEND=noninteractive

# add key to keyring so it doesn't complain 
gpg --keyserver pgp.mit.edu --recv-key 381BA480
gpg -a --export 381BA480 > jranke_cran.asc
sudo apt-key add jranke_cran.asc

sudo apt-get update

# install the latest R
sudo apt-get install --yes --force-yes r-base 

Но этот скрипт зависает со следующим запросом на ввод:

введите описание изображения здесь

ОК, поэтому я попытался остановить службы, используя следующий скрипт:

sudo /etc/init.d/mysql stop
sudo /etc/init.d/exim4 stop
sudo /etc/init.d/cron stop
sudo apt-get install --yes --force-yes libc6

Это не работает, и интерактивный экран возвращается, но на этот раз только cron указан в качестве службы, которую необходимо перезапустить.

Так есть ли способ заставить libc6 просто перезапустить эти сервисы без участия пользователя? Или есть способ остановить cron, чтобы он не вызывал интерактивное приглашение? Может быть, творческий вариант, о котором я никогда не думал?

Имейте в виду, что эта система запущена, некоторый код Hadoop запущен, а затем разрушен. Таким образом, я могу смириться с побочными эффектами и плохим поведением, которые мы, возможно, не хотим на рабочем компьютере или веб-сервере.

6 ответов

Решение

Я не уверен в настройках в Lenny, но я знаю, что в Squeeze sudo настроен с env_reset Это означает, что перед запуском команды будут удалены все переменные env, кроме очень немногих.

Это значит, что установленная вами переменная DEBIAN_FRONTEND никогда не будет apt-get install --yes --force-yes r-base, Если у вас есть полный доступ к sudo, то есть вы находитесь в файлах sudoers с ALL = ALL разрешения, то вы можете переопределить это поведение.

Попробуйте вместо этого использовать следующее.

sudo DEBIAN_FRONTEND=noninteractive apt-get install --yes --force-yes r-base

Изменить: Обратите внимание, что переписать скрипт, чтобы не использовать sudo везде и вместо этого запустить скрипт от имени root также будет работать. Но делать это просто позволит избежать реальной проблемы, на которую я указал, вместо того, чтобы решать ее и учиться на ней.

Более краткий вариант решения debconf, упомянутого в другом ответе, следующий:

echo 'библиотеки libc6 / перезапуск без запроса логического true' | sudo debconf-set-selection

Я просто успешно использовал это решение при обновлении glibc на Debian 7 (wheezy).

Для любопытных я нашел правильную переменную конфигурации для установки следующим образом:

sudo apt-get установить debconf-utils

sudo apt-get install -y libc6 # ответ на приглашение в интерактивном режиме

debconf-get-selections | grep libc6

Шаг 1

На хосте, на котором пакет был установлен вручную (интерактивный выбор параметров), запустите:

apt-get install debconf-utils
debconf-get-selections > answers.conf


Шаг 2 (необязательно)

На этом этапе вы можете захотеть отфильтровать answers.conf, чтобы включить ответы конфигурации только для определенных пакетов. Я тестировал без фильтрации.


Шаг 3

При создании нового хоста включите answers.conf вместе со сценарием автоматической установки. Перед запуском apt-get installв сценарии запустите:

debconf-set-selections --verbose < answers.conf


Результат

Это заполнит базу данных debconf предопределенными ответами. Интерактивные вопросы не будут задаваться при запуске apt-get install,

Помимо того, что мы обсуждали в электронной почте, есть также поговорка

Если вы не можете победить их, присоединяйтесь к ним.

чтобы вы могли создать на своем ноутбуке виртуальную машину, которая соответствует (базовым) пакетам в экземпляре облака, а затем пересобрать свой собственный локальный R 2.12.1 .deb для этих пакетов. Как не модернизированный libc6 участвует, вы бы обойти проблему.

Или, в соответствии с вашим комментарием о возможных побочных эффектах, вы можете удалить exim4, mysql и cron. Ваши рабочие места R не будут нуждаться в них. Что-то вроде

sudo dpkg --force-depends --remove ...names of your packages here...

но я не могу поверить, что рекомендую это:). Вам могут понадобиться пробная версия и ошибка, чтобы получить все связанные пакеты exim и mysql.

Я смог сделать вывод, что установщик libc6 предлагал перезапустить cron, даже если cron не работал, что кажется странным. Во всяком случае, я смог обойти это, переименовав сценарии cron init.d, так что установщик пакета был обманут, не думая, что cron присутствует. Тьфу. Что за беспорядок

sudo /etc/init.d/mysql stop
sudo /etc/init.d/exim4 stop
sudo /etc/init.d/cron stop
sudo mv /etc/init.d/cron /etc/init.d/cron.bak
sudo apt-get install --yes --force-yes libc6
sudo mv /etc/init.d/cron.bak /etc/init.d/cron
sudo /etc/init.d/mysql start
sudo /etc/init.d/exim4 start
sudo /etc/init.d/cron start

После этого маленького танца кабуки я могу установить последнюю версию R.

Ты можешь попробовать:

printf "\n" | sudo apt-get install --yes --force-yes libc6 
Другие вопросы по тегам