Я пытаюсь создать сценарий, который принудительно устанавливает 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 запускается, а затем она разрушается. Так что я могу мириться с побочными эффектами и плохим поведением, которые нам, возможно, не нужны на рабочем настольном компьютере или веб-сервере.
Я не уверен в настройках Lenny, но я знаю, что в Squeeze sudo настроен с env_reset
это означает, что перед запуском команды будут удалены все, кроме очень нескольких переменных env select.
Это означает 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-selections
Я только что успешно использовал это решение при обновлении glibc на Debian 7 (wheezy).
Для любопытных я нашел правильную переменную конфигурации для установки следующим образом:
sudo apt-get install debconf-utils
sudo apt-get install -y libc6 # интерактивный ответ на запрос
debconf-get-selections | grep libc6
На хосте, на котором пакет был установлен вручную (интерактивный выбор параметров), запустите:
apt-get install debconf-utils
debconf-get-selections > answers.conf
На этом этапе вы можете отфильтровать answers.conf чтобы включить ответы о конфигурации только для определенных пакетов. Тестировал без фильтрации.
При создании нового хоста включите 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