Ich versuche, ein Skript zu erstellen, das eine Debian Lenny-Installation zwingt, die neueste Version von CRAN R zu installieren. Während der Installation scheint libc6 aktualisiert zu sein und die Installation möchte interaktiv bestätigen, dass es in Ordnung ist, drei Dienste (mysql, exim4, cron) neu zu starten ). Dieser Prozess muss unbeaufsichtigt sein, da er auf EMR-Computern (Elastic Map Reduce) von Amazon ausgeführt wird. Aber mir gehen die Optionen aus. Hier sind einige Dinge, die ich versucht habe:
Diese vorherige Frage scheint genau das zu sein, wonach ich suche. Also habe ich mein Installationsskript wie folgt eingerichtet:
# 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
Dieses Skript hängt jedoch mit der folgenden Eingabeaufforderung:
OK, also habe ich versucht, die Dienste mit dem folgenden Skript zu stoppen:
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
Dies funktioniert nicht und der interaktive Bildschirm wird wieder angezeigt, diesmal jedoch nur mit cron als Dienst, der neu gestartet werden muss.
Gibt es also eine Möglichkeit, libc6 dazu zu bringen, diese Dienste ohne Benutzereingabe neu zu starten? Oder gibt es eine Möglichkeit, cron zu stoppen, damit keine interaktive Eingabeaufforderung ausgelöst wird? Vielleicht eine kreative Option, an die ich noch nie gedacht habe?
Denken Sie daran, dass dieses System aufgerufen wird, etwas Hadoop-Code ausgeführt wird und dann abgerissen wird. So kann ich Nebenwirkungen und schlechtes Verhalten ertragen, die wir auf einem Produktions-Desktop-Computer oder Webserver möglicherweise nicht wollen.
Antworten:
Ich bin mir der Einstellungen in Lenny nicht sicher, aber ich weiß, dass sudo in Squeeze so konfiguriert ist, dass
env_reset
alle bis auf einige ausgewählte env-Variablen entfernt werden, bevor der Befehl ausgeführt wird.Dies bedeutet, dass die von Ihnen festgelegte Variable DEBIAN_FRONTEND es nie tatsächlich in die Variable schafft
apt-get install --yes --force-yes r-base
. Wenn Sie vollen Zugriff auf sudo haben, dh sich in den sudoers-Dateien mitALL = ALL
Berechtigungen befinden, können Sie dieses Verhalten überschreiben.Versuchen Sie stattdessen Folgendes.
Bearbeiten: Beachten Sie, dass das Umschreiben des Skripts, um nicht überall sudo zu verwenden und stattdessen das Skript als root auszuführen, ebenfalls funktionieren würde. Aber das würde nur das eigentliche Problem vermeiden, auf das ich hingewiesen habe, anstatt es zu lösen und daraus zu lernen.
quelle
sudo sh -c "DEBIAN_FRONTEND=noninteractive apt-get install --yes --force-yes r-base"
sh -c
?sh -c
Methode funktioniert sicher, solange Sie sh durch sudo ausführen dürfen. Die von mir verwendete kann von sudo abhängig von der sudo-Konfiguration abgelehnt werden, aber ich halte es für sehr unwahrscheinlich, dass dies in einer Situation passieren würde, die Siesh -c
als Alternative verwenden könnten .Eine prägnantere Variante der in einer anderen Antwort erwähnten Debconf-Lösung ist die folgende:
Ich habe diese Lösung gerade erfolgreich beim Upgrade von glibc auf Debian 7 (keuchend) verwendet.
Für die Neugierigen fand ich die richtige Konfigurationsvariable wie folgt:
quelle
Schritt 1
Führen Sie auf dem Host, auf dem das Paket manuell installiert wurde (Auswahl interaktiver Optionen) Folgendes aus:
Schritt 2 (optional)
An dieser Stelle möchten Sie möglicherweise die Datei answers.conf filtern , um die Konfigurationsantworten nur für bestimmte Pakete einzuschließen. Ich habe ohne Filterung getestet.
Schritt 3
Fügen Sie beim Erstellen eines neuen Hosts die Datei answers.conf zusammen mit Ihrem Skript für die automatische Installation hinzu. Führen Sie vor dem Ausführen
apt-get install
im Skript Folgendes aus:Ergebnis
Dadurch wird die Debconf-Datenbank mit vordefinierten Antworten gefüllt. Die interaktiven Fragen werden beim Ausführen nicht gestellt
apt-get install
.quelle
debconf
Optionen, auf die Sie im Hinterkopf hinweisen. Ich brauche die vielleicht das nächste Mal.Neben dem, was wir in der E-Mail besprochen haben, gibt es auch das Sprichwort
Sie können also auf Ihrem Laptop eine virtuelle Maschine erstellen, die den (Basis-) Paketen in der Cloud-Instanz entspricht, und dann Ihre eigene lokale R 2.12.1 .deb für diese Pakete neu erstellen. Da kein Upgrade erforderlich
libc6
ist, können Sie das Problem umgehen.Oder Sie können exim4, mysql und cron deinstallieren, entsprechend Ihrem Kommentar zu möglichen Nebenwirkungen. Ihre R-Jobs brauchen sie nicht. Etwas wie
aber ich kann nicht wirklich glauben, dass ich das empfehle :) Möglicherweise benötigen Sie einen Versuch und Irrtum, um alle zugehörigen Exim- und MySQL-Pakete zu erhalten.
quelle
Ich konnte daraus schließen, dass das libc6-Installationsprogramm aufgefordert wurde, cron neu zu starten, auch wenn cron nicht ausgeführt wurde, was seltsam erscheint. Auf jeden Fall konnte ich das umgehen, indem ich die cron init.d-Skripte umbenannte, so dass das Paketinstallationsprogramm getäuscht wurde, nicht zu glauben, dass cron vorhanden war. Pfui. Was für ein Chaos:
Nach diesem kleinen Kabuki-Tanz kann ich das neueste R installieren.
quelle
Du kannst es versuchen:
quelle
libc6
Upgrade die Probleme verursacht, die er hat.pringf "\n" |
Stück ist neu. Ich mag es, aber ich habe es versucht und aus irgendeinem Grund hat es nicht dazu geführt, dass die Bestätigungsseite nicht mehr angezeigt wurde. Gott weiß nur, was das gegessen hat\n
.printf "\n"
Cursor nicht mehr im Feld und ich kann überhaupt nicht auf dem Bildschirm navigieren. Wirklich seltsam. Ich hatte Hoffnung auf diesen Hack.