dpkg-reconfigure: no se puede volver a abrir stdin: no hay archivo o directorio

75

Estoy creando un script de aprovisionamiento para a ubuntu vagrant vm, en a ubuntu host, ambos 12.10 64bitAl instalar los siguientes paquetes:

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

Recibo la advertencia:

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

He intentado buscar, pero los resultados arrojan cualquier otro error con apt-get possible, no puedo encontrar cómo suprimir la advertencia anterior. Las instalaciones funcionan, pero la advertencia anterior está causando líneas de error en el stdout vagabundo.

Alguien tiene idea de cuál podría ser la causa o cómo suprimir la advertencia

Daithí
fuente

Respuestas:

91

Recibí el mensaje de error que desaparece al poner lo siguiente en mi script de aprovisionamiento, antes de cualquier apt-getllamada:

export DEBIAN_FRONTEND=noninteractive

Esto hace debconfuso de una interfaz que no espera ninguna entrada interactiva, evitando que incluso intente acceder stdin.

der_gabe
fuente
3
Esta es la respuesta correcta. La mayoría de las aplicaciones de administración de configuración (SaltStack, Puppet, etc.) aprovechan esto para las instalaciones de paquetes no interactivos.
notpeter
1
Respuesta correcta, lo secundo.
stefgosselin
13
Sin embargo, no funciona para dpkg-preconfigure.
kursus
export DEBIAN_FRONTEND=noninteractivetrabajó para mí en el dpkg-preconfigureescenario
Snowcrash
23

La respuesta fue establecer los perl:locale's según esto :

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

Esto resuelve el problema, pero agrega tiempo no deseado al vagrant upaprovisionamiento.

Daithí
fuente
2
Esto solo no funcionó para mí. Todavía recibí la advertencia hasta que implementé la corrección de 70debconfcomentarios de @ kenorb para preconfigurar.
Brian
Mi pregunta es: ¿está bien ignorar estas advertencias? @Coombesy
Marco Prins
@MarcoPrins Sí, puede ignorar con seguridad advertencias como "stdin: no es un tty" o "dpkg-preconfigure: no se puede volver a abrir stdin: No existe tal archivo o directorio". Se puede encontrar una de las numerosas confirmaciones, por ejemplo, aquí ikusalic.com/blog/2013/10/03/vagrant-intro
mloskot el
9

Ejecute este comando:

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

para ver si tienes este archivo. Si es así, la solución es comentar la DPkglínea que evita la configuración previa de todos los paquetes debconfantes de que se instalen.

Entonces agregue estos comandos a su archivo de aprovisionamiento:

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

De lo contrario, si no le importa este archivo, simplemente elimínelo:

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

Aquí hay algunos otros comandos a tener en cuenta, pero no creo que hagan nada útil:

sudo dpkg-preconfigure -f noninteractive -p critical
sudo dpkg --configure -a
kenorb
fuente
1
Esto es lo que finalmente funcionó para mí en OSX Yosemite Vagrant y Ubuntu 14.04.
Brian
Es posible que aún necesite cambiar los usos de Shell Vagrant.
ToothlessRebel
1
Jugar con este archivo fue lo único que funcionó para mí (obviamente ignorando las sugerencias de "redireccionar stderr", lo que creo que es un mal consejo) Elegí usar un par de pasos de aprovisionamiento antes / después para incluir temporalmente la --frontend=noninteractiveopción en el comando definido en el archivo. sudo sed -i 's/\(dpkg-preconfigure\) --apt/\1 --frontend=noninteractive --apt/' /etc/apt/apt.conf.d/70debconfantes y sudo sed -i 's/ --frontend=noninteractive//' /etc/apt/apt.conf.d/70debconfdespués
Phil
5

La redirección de Bash funciona bien para stdout y stderr.

Para redirigir la secuencia de error, use lo siguiente:

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

Para redirigir tanto stdout (mensajes que no son errores / advertencias) como stderr ambos, use:

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

Ese es un acceso directo disponible en bash para esto:

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

O:

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

A continuación, podemos ver claramente que el descriptor de archivo 1 es 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

Entonces, para lo que dices que quieres hacer, solo deberías necesitar el primer comando que di.

Tiburón toro
fuente
1
Quiero poder hacer eco del stdout normal de apt-get. Pero puede que me tengas en el camino correcto ... intentaré enviar solo el stderr al bit-bucket - edición de saludos: ambos comentamos al mismo tiempo lol - saludos (de nuevo)
Daithí
Edité la publicación. Ver la última línea.
BullShark