dpkg-reconfigure: nie można ponownie otworzyć stdin: Brak pliku lub katalogu

74

Buduję skrypt zaopatrzenie dla ubuntu vagrant vm, na zasadzie ubuntu host, zarówno 12.10 64bitPodczas instalacji następujące pakiety:

sudo apt-get -y install php5-xsl graphviz php-pear unison

Dostaję ostrzeżenie:

dpkg-reconfigure: unable to re-open stdin: No file or directory

próbowałem wyszukać, ale wyniki wyrzucają co drugi błąd z apt-get możliwym, nie mogę dowiedzieć się, jak wyłączyć powyższe ostrzeżenie. Instalacje działają, ale powyższe ostrzeżenie powoduje pojawienie się błędów w błędnym standardzie.

Każdy, kto ma pojęcie, co może być przyczyną lub jak znieść ostrzeżenie

Daithí
źródło

Odpowiedzi:

90

Otrzymałem komunikat o błędzie, aby zniknąć, umieszczając w skrypcie obsługi administracyjnej następujące polecenie przed wszelkimi apt-getwywołaniami:

export DEBIAN_FRONTEND=noninteractive

To sprawia, że debconfużywa się interfejsu, który nie oczekuje żadnych interaktywnych danych wejściowych, uniemożliwiając nawet próbę dostępu stdin.

der_gabe
źródło
3
To jest poprawna odpowiedź. Większość aplikacji do zarządzania konfiguracjami (SaltStack, Puppet itp.) Korzysta z tego w przypadku nieinteraktywnych instalacji pakietów.
nie
1
Prawidłowa odpowiedź, popieram to.
stefgosselin
13
Nie działa jednak w przypadku dpkg-preconfigure.
kursus
export DEBIAN_FRONTEND=noninteractivepracował dla mnie na dpkg-preconfigurescenie
Snowcrash
23

Odpowiedzią było ustawić perl:locale„s, jak na to :

export LANGUAGE=en_US.UTF-8
export LANG=en_US.UTF-8
export LC_ALL=en_US.UTF-8
locale-gen en_US.UTF-8
dpkg-reconfigure locales

To rozwiązuje problem, ale dodaje niechcianego czasu do vagrant upudostępniania.

Daithí
źródło
2
Samo to nie działało dla mnie. Nadal otrzymywałem ostrzeżenie, dopóki nie zaimplementowałem poprawki 70debconfkomentowania @ kenorb dla wstępnej konfiguracji.
Brian
Moje pytanie brzmi: czy można zignorować te ostrzeżenia? @Coombesy
Marco Prins,
@MarcoPrins Tak, możesz bezpiecznie zignorować ostrzeżenia takie jak „stdin: nie jest tty” lub „dpkg-preconfigure: nie można ponownie otworzyć stdin: brak takiego pliku lub katalogu”. Jedno z licznych potwierdzeń można znaleźć, np. Tutaj ikusalic.com/blog/2013/10/03/vagrant-intro
mloskot
9

Uruchom to polecenie:

cat /etc/apt/apt.conf.d/70debconf 

aby sprawdzić, czy masz ten plik. Jeśli tak, rozwiązaniem jest skomentowanie DPkglinii, która uniemożliwia wstępną konfigurację wszystkich pakietów debconfprzed ich instalacją.

Dodaj więc te polecenia do pliku udostępniania:

sudo ex +"%s@DPkg@//DPkg" -cwq /etc/apt/apt.conf.d/70debconf
sudo dpkg-reconfigure debconf -f noninteractive -p critical

W przeciwnym razie, jeśli nie obchodzi cię ten plik, po prostu go usuń:

sudo rm -v /etc/apt/apt.conf.d/70debconf

Oto kilka innych poleceń do rozważenia, ale nie sądzę, aby zrobiły coś pożytecznego:

sudo dpkg-preconfigure -f noninteractive -p critical
sudo dpkg --configure -a
kenorb
źródło
1
To w końcu działało dla mnie na OSX Yosemite Vagrant i Ubuntu 14.04.
Brian
Być może nadal będziesz musiał zmienić powłokę, z której korzysta Vagrant.
ToothlessRebel,
1
Bałagan z tym plikiem był jedyną rzeczą, która zadziałała dla mnie (oczywiście ignorując sugestie „przekierowania stderr”, co moim zdaniem jest złą radą). Wybrałem użycie przed / po parze etapów udostępniania, aby tymczasowo dołączyć --frontend=noninteractiveopcję do polecenia zdefiniowanego w pliku. sudo sed -i 's/\(dpkg-preconfigure\) --apt/\1 --frontend=noninteractive --apt/' /etc/apt/apt.conf.d/70debconfprzed i sudo sed -i 's/ --frontend=noninteractive//' /etc/apt/apt.conf.d/70debconfpo.
phils
5

Przekierowanie Bash działa dobrze dla stdout i stderr.

Aby przekierować strumień błędów, użyj:

sudo apt-get -y install php5-xsl graphviz php-pear unison 2> /dev/null

Aby przekierować oba stdout (komunikaty, które nie są błędami / ostrzeżeniami) i stderr oba, użyj:

sudo apt-get -y install php5-xsl graphviz php-pear unison &> /dev/null

Jest to skrót dostępny w bash do tego:

sudo apt-get -y install php5-xsl graphviz php-pear unison > /dev/null 2>&1

Lub:

sudo apt-get -y install php5-xsl graphviz php-pear unison 1> /dev/null 2>&1

Poniżej wyraźnie widać, że deskryptor pliku 1 to stdout, 2 stderr, 3 stdin.

$ ls -l /dev/std*
lrwxrwxrwx 1 root root 15 Apr 18 19:03 /dev/stderr -> /proc/self/fd/2
lrwxrwxrwx 1 root root 15 Apr 18 19:03 /dev/stdin -> /proc/self/fd/0
lrwxrwxrwx 1 root root 15 Apr 18 19:03 /dev/stdout -> /proc/self/fd/1

Więc do tego, co mówisz, że chcesz zrobić, powinieneś potrzebować tylko pierwszego polecenia, które wydałem.

BullShark
źródło
1
Chcę mieć możliwość powtórzenia normalnego standardu z apt-get. Ale możesz mieć mnie na właściwym torze ... spróbuję wysłać tylko stderr do bitu - wiwaty edytuj: oboje skomentowaliśmy w tym samym czasie lol - wiwaty (ponownie)
Daithí
Zredagowałem post. Zobacz ostatnią linię.
BullShark,