I'm trying to create a script that forces a Debian Lenny install to install the latest version of CRAN R. During the install it appears libc6 is upgraded and the install wants interactive confirm that it's OK to restart three services (mysql, exim4, cron). This process HAS to be unattended as it runs on Amazon's Elastic Map Reduce (EMR) machines. But I'm running out of options. Here's a few things I've tried:
This previous question appears to be exactly what I'm looking for. So I set up my install script as follows:
# 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
But this script hangs with the following request for input:
OK, so I tried stopping the services using the following script:
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
This does not work and the interactive screen comes back, but this time with only cron listed as the service that must be restarted.
So is there a way to make libc6 just restart these services with no user input? Or is there a way to stop cron so it does not cause an interactive prompt? Maybe a creative option I've never thought of?
Keep in mind that this system is brought up, some Hadoop code is run, and then it's torn down. So I can put up with side effects and bad behavior that we might not want in a production desktop machine or web server.
I'm not positive on the settings in Lenny but I know that in Squeeze, sudo is configured with
env_reset
meaning it will strip out all but a very few select env variables before running the command.This means the DEBIAN_FRONTEND variable you set is never actually making it to the
apt-get install --yes --force-yes r-base
. If you have full access to sudo, meaning you are in the sudoers files withALL = ALL
permissions, then you can override this behavior.Try using the following instead.
Edit: Note that rewriting the script to not use sudo everywhere and instead run the script as root would also work. But doing that would just be avoiding the real problem I pointed out instead of solving it and learning from it.
A more concise variant of the debconf solution mentioned in another answer is the following:
I just used this solution successfully when upgrading glibc on Debian 7 (wheezy).
For the curious, the way I found the right configuration variable to set was as follows:
Step 1
On the host that had the package installed manually (interactive option selection) run:
Step 2 (Optional)
At this point you may want to filter answers.conf to include the configuration answers only for specific package(s). I tested without filtering.
Step 3
When creating a new host, include answers.conf along with your automatic installation script. Before running
apt-get install
, in the script, run:Result
This will fill the debconf database with predefined answers. The interactive questions will not be asked when you run
apt-get install
.Besides what we discussed in email, there is also the saying
so you could create a virtual machine on your laptop which corresponds to the (base) packages on the cloud instance, and then rebuild your own local R 2.12.1 .deb against those packages. As no upgraded
libc6
is involved, you'd sidestep the issue.Or, in line with your comment on possible side-effects being permitted, you could uninstall exim4, mysql and cron. Your R jobs won't need them. Something like
but I can't really believe I recommend this :) You may need a trial and error to get all related exim and mysql packages.
I was able to deduce that the libc6 installer was prompting to restart cron even if cron was not running which seems odd. At any rate I was able to get around that by renaming the cron init.d scripts so that the package installer was fooled into not thinking cron was present. Ugh. What a mess:
After that little kabuki dance I can install the latest R.
You can try: