Debian kann nicht zur unbeaufsichtigten Installation gezwungen werden. Libc6 möchte eine interaktive Bestätigung

7

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:

Geben Sie hier die Bildbeschreibung ein

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.

JD Long
quelle
Mögliches Duplikat von Ubuntu dpkg, nicht interaktive Installation
Alastair Irvine

Antworten:

11

Ich bin mir der Einstellungen in Lenny nicht sicher, aber ich weiß, dass sudo in Squeeze so konfiguriert ist, dass env_resetalle 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 schafftapt-get install --yes --force-yes r-base . Wenn Sie vollen Zugriff auf sudo haben, dh sich in den sudoers-Dateien mit ALL = ALLBerechtigungen befinden, können Sie dieses Verhalten überschreiben.

Versuchen Sie stattdessen Folgendes.

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

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.

Pfeilmeister
quelle
Ich habe abgestimmt, empfehle aber auch, den Befehl aufsudo sh -c "DEBIAN_FRONTEND=noninteractive apt-get install --yes --force-yes r-base"
bahamat
@bahamat, ich habe sowohl die Lösung von @ arrowmaster als auch Ihre getestet. Beide arbeiten für mich. Vielen Dank an beide. Was ist der Vorteil der Weitergabe des Befehls sh -c?
JD Long
@JD Long: Die sh -cMethode 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 Sie sh -cals Alternative verwenden könnten .
Arrowmaster
4

Eine prägnantere Variante der in einer anderen Antwort erwähnten Debconf-Lösung ist die folgende:

echo 'libc6 library / restart-without-ask boolean true' | sudo debconf-set-selections

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:

sudo apt-get install debconf-utils

sudo apt-get install -y libc6 # Eingabeaufforderung interaktiv beantworten

debconf-get-selections | grep libc6

Bill Mark
quelle
2
Es ist schön, dass Sie die Tools bereitgestellt haben, mit denen Sie die Antwort erhalten haben. Das könnte dem nächsten Mann helfen, die Antwort auf ein anderes Problem zu finden.
Slartibartfast
3

Schritt 1

Führen Sie auf dem Host, auf dem das Paket manuell installiert wurde (Auswahl interaktiver Optionen) Folgendes aus:

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


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 installim Skript Folgendes aus:

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


Ergebnis

Dadurch wird die Debconf-Datenbank mit vordefinierten Antworten gefüllt. Die interaktiven Fragen werden beim Ausführen nicht gestellt apt-get install.

Aleksandr Levchuk
quelle
Danke für deine Hilfe. Ich habe eine hässliche, aber funktionierende Lösung. Aber ich halte mich an die debconfOptionen, auf die Sie im Hinterkopf hinweisen. Ich brauche die vielleicht das nächste Mal.
JD Long
2

Neben dem, was wir in der E-Mail besprochen haben, gibt es auch das Sprichwort

Wenn du sie nicht schlagen kannst, mach mit.

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 libc6ist, 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

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

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.

Dirk Eddelbuettel
quelle
Jetzt reden wir über rohe Gewalt! ;) Ich habe versucht, cron zu deinstallieren und es gibt mir die Möglichkeit, einen Bestätigungssatz einzugeben, etwa "Ich weiß, dass ich verrückt bin, aber es ist in Ordnung"
JD Long
Ah, verdammt ja. Ich denke, Pakete mit einer bestimmten Priorität: können das bekommen. Also zurück zum Erstellen eines benutzerdefinierten / lokalen R .deb-Pakets? Oder können Sie nicht einfach R von Lenny ausführen (und die entsprechenden CRAN-Pakete 'manuell' aus dem Archivbereich von CRAN
abrufen
Dies war ein viel größerer Schmerz in meinem Arsch, als ich es mir jemals vorgestellt hatte. Der Kludge unten hat mir etwas Zeit verschafft ... fürs Erste. Nochmals vielen Dank, dass Sie mir beim Brainstorming von Ideen geholfen haben.
JD Long
1

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:

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

Nach diesem kleinen Kabuki-Tanz kann ich das neueste R installieren.

JD Long
quelle
Yay. Gut genug für die Regierung, ähm, Modellierungsarbeit, wie wir sagen.
Dirk Eddelbuettel
0

Du kannst es versuchen:

printf "\n" | sudo apt-get install --yes --force-yes libc6 
Aleksandr Levchuk
quelle
Ich schlug das JD früher vor; Dies führt dazu, dass das libc6Upgrade die Probleme verursacht, die er hat.
Dirk Eddelbuettel
Das 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.
JD Long
Versuchen Sie, mehrere \ n zu setzen
Aleksandr Levchuk
Seltsamerweise macht es etwas Seltsames auf dem blauen Bildschirm. Wenn ich das hinzufüge, befindet sich der printf "\n"Cursor nicht mehr im Feld und ich kann überhaupt nicht auf dem Bildschirm navigieren. Wirklich seltsam. Ich hatte Hoffnung auf diesen Hack.
JD Long