我正在尝试创建一个脚本,强制 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 代码被运行,然后它被拆除。因此,我可以忍受我们可能不希望在生产台式机或 Web 服务器上出现的副作用和不良行为。
答案1
我不太确定 Lenny 中的设置,但我知道在 Squeeze 中,sudo 的配置意味着env_reset
在运行命令之前它会删除除极少数选定的环境变量之外的所有内容。
这意味着DEBIAN_前端您设置的变量实际上永远不会进入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 身份运行脚本也是可行的。但这样做只会回避我指出的真正问题,而不是解决它并从中吸取教训。
答案2
步骤1
在手动安装该包的主机上(交互式选项选择)运行:
apt-get install debconf-utils
debconf-get-selections > answers.conf
第 2 步(可选)
此时你可能想要过滤答案.conf仅包含特定包的配置答案。我测试时没有进行过滤。
步骤3
创建新主机时,包括答案.conf以及自动安装脚本。在运行之前apt-get install
,在脚本中运行:
debconf-set-selections --verbose < answers.conf
结果
这将用预定义的答案填充 debconf 数据库。运行时将不会询问交互式问题apt-get install
。
答案3
另一个答案中提到的 debconf 解决方案的更简洁的变体如下:
echo ‘libc6 库/重新启动而无需询问布尔值 true’ | sudo debconf-set-selections
我刚刚在 Debian 7(wheezy)上升级 glibc 时成功使用了这个解决方案。
出于好奇,我找到要设置的正确配置变量的方法如下:
sudo apt-get 安装 debconf-utils
sudo apt-get install -y libc6 # 以交互方式回答提示
debconf-get-selections | grep libc6
答案4
我能够推断出 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 了。