dpkg-reconfigure: não é possível abrir novamente stdin: nenhum arquivo ou diretório

75

Estou construindo um script de provisionamento para um ubuntu vagrant vm, em um ubuntu host, ambos 12.10 64bitAo instalar os seguintes pacotes:

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

Eu recebo o aviso:

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

tentei pesquisar, mas os resultados estão gerando todos os outros erros com o apt-get possível, não consigo descobrir como suprimir o aviso acima. As instalações funcionam, mas o aviso acima está causando linhas de erro no padrão stdout.

Alguém tem alguma idéia do que poderia ser a causa ou como suprimir o aviso

Daithí
fonte

Respostas:

91

Recebi a mensagem de erro, colocando o seguinte no meu script de provisionamento, antes de qualquer apt-getchamada:

export DEBIAN_FRONTEND=noninteractive

Isso faz debconfuso de um front-end que não espera nenhuma entrada interativa, impedindo que ele tente acessar stdin.

der_gabe
fonte
3
Essa é a resposta correta. A maioria dos aplicativos de gerenciamento de configurações (SaltStack, Puppet, etc) aproveita isso para instalações de pacotes não interativos.
Notpeter 04/04
1
Resposta correta, eu segundo isso.
31515 stefgosselin
13
Porém, ele não funciona para o dpkg-preconfigure.
Kursus #
export DEBIAN_FRONTEND=noninteractivetrabalhou para mim no dpkg-preconfigurepalco
Snowcrash
23

A resposta foi definir o perl:locale's conforme esta :

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

Isso resolve o problema, mas adiciona tempo indesejado ao vagrant upprovisionamento.

Daithí
fonte
2
Isso por si só não funcionou para mim. Eu ainda recebi o aviso até implementar a correção de 70debconfcomentários do @ kenorb para pré-configurar.
Brian
Minha pergunta é: É bom ignorar esses avisos? @Coombesy
Marco Prins
@MarcoPrins Sim, você pode ignorar com segurança avisos como "stdin: não é um tty" ou "dpkg-preconfigure: incapaz de reabrir stdin: não existe esse arquivo ou diretório". Uma das inúmeras confirmações ao redor pode ser encontrada, por exemplo, aqui ikusalic.com/blog/2013/10/03/vagrant-intro
mloskot
9

Execute este comando:

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

para ver se você possui esse arquivo. Nesse caso, a solução é comentar a DPkglinha que impede a pré-configuração de todos os pacotes debconfantes de serem instalados.

Portanto, adicione estes comandos ao seu arquivo de provisionamento:

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

Caso contrário, se você não se importa com esse arquivo, basta removê-lo:

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

Aqui estão alguns outros comandos a serem considerados, mas não acho que eles façam algo útil:

sudo dpkg-preconfigure -f noninteractive -p critical
sudo dpkg --configure -a
kenorb
fonte
1
Foi o que finalmente funcionou para mim no OSX Yosemite Vagrant e no Ubuntu 14.04.
Brian
Você ainda pode precisar alterar o shell que o Vagrant usa.
precisa saber é o seguinte
1
Mexer com esse arquivo foi a única coisa que funcionou para mim (obviamente ignorando as sugestões "redirecionar stderr", o que eu acho que é um mau conselho). Optei por usar um par de etapas de provisionamento antes / depois para incluir temporariamente a --frontend=noninteractiveopção no comando definido no arquivo. sudo sed -i 's/\(dpkg-preconfigure\) --apt/\1 --frontend=noninteractive --apt/' /etc/apt/apt.conf.d/70debconfantes e sudo sed -i 's/ --frontend=noninteractive//' /etc/apt/apt.conf.d/70debconfdepois.
phils 3/07
5

O redirecionamento Bash funciona bem para stdout e stderr.

Para redirecionar o fluxo de erros, use o seguinte:

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

Para redirecionar stdout (mensagens que não são erros / avisos) e stderr ambos, use:

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

Esse é um atalho disponível no bash para isso:

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

Ou:

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

Abaixo, podemos ver claramente que o descritor de arquivo 1 é 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

Portanto, para o que você está dizendo que deseja fazer, você só precisa do primeiro comando que dei.

Tubarão touro
fonte
1
Eu quero ser capaz de ecoar o stdout normal do apt-get. Mas você pode ter me no caminho certo ... Vou tentar enviar apenas o stderr para o bit-bucket - aplausos edit: ambos comentou, ao mesmo tempo LOL - vivas (de novo)
Daithí
Eu editei a postagem. Veja a última linha.
bullshark