dpkg-reconfigure: impossible de rouvrir stdin: aucun fichier ou répertoire

75

Je construis un script de provisioning pour un ubuntu vagrant vm, sur un ubuntu host, les deux 12.10 64bitLors de l'installation des packages suivants:

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

Je reçois l'avertissement:

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

ont essayé de chercher, mais les résultats ont généré toutes les erreurs avec apt-get, impossible de trouver comment supprimer l'avertissement ci-dessus. Les installations fonctionnent, mais l’avertissement ci-dessus provoque des lignes d’erreur dans le vagant up stdout.

N'importe qui peut savoir quelle pourrait être la cause ou comment supprimer l'avertissement

Daithí
la source

Réponses:

91

J'ai reçu le message d'erreur de disparaître en mettant le texte suivant dans mon script de provisioning, avant tout apt-getappel:

export DEBIAN_FRONTEND=noninteractive

Cela rend l' debconfutilisation d'une interface qui n'attend aucune entrée interactive, l'empêchant même d'essayer d'accéder stdin.

der_gabe
la source
3
C'est la bonne réponse. La plupart des applications de gestion de la configuration (SaltStack, Puppet, etc.) en tirent parti pour les installations de paquet non interactives.
notpeter
1
Bonne réponse, je seconde cela.
stefgosselin
13
Cela ne fonctionne pas pour dpkg-preconfigure cependant.
Kursus
export DEBIAN_FRONTEND=noninteractivea travaillé pour moi au dpkg-preconfigurestade
Snowcrash
23

La réponse a été de définir les perl:locale« s selon ce :

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

Cela résout le problème, mais ajoute du temps non souhaité à la vagrant upmise en service.

Daithí
la source
2
Cela seul n'a pas fonctionné pour moi. J'ai toujours eu l'avertissement jusqu'à ce que j'ai implémenté le correctif de 70debconfcommentaire de @ kenorb pour la préconfiguration.
Brian
Ma question est la suivante: faut-il ignorer ces avertissements? @Coombesy
Marco Prins le
@MarcoPrins Oui, vous pouvez ignorer en toute sécurité les avertissements tels que "stdin: n'est pas un tty" ou "dpkg-preconfigure: impossible de rouvrir stdin: aucun fichier ni répertoire de ce type". Une des nombreuses confirmations disponibles peut être trouvée, par exemple ici. Ikusalic.com/blog/2013/10/03/vagrant-intro
mloskot
9

Exécutez cette commande:

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

pour voir si vous avez ce fichier. Si tel est le cas, la solution consiste à commenter la DPkgligne qui empêche la préconfiguration de tous les packages debconfavant leur installation.

Ajoutez donc ces commandes à votre fichier de provision:

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

Sinon, si vous ne vous souciez pas de ce fichier, supprimez-le simplement:

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

Voici quelques autres commandes à prendre en compte, mais je ne pense pas qu'elles soient utiles:

sudo dpkg-preconfigure -f noninteractive -p critical
sudo dpkg --configure -a
Kenorb
la source
1
C'est ce qui a finalement fonctionné pour moi sur OSX Yosemite Vagrant et Ubuntu 14.04.
Brian
Vous devrez peut-être encore changer le shell utilisé par Vagrant.
ToothlessRebel
1
Ce fichier a été la seule chose qui a fonctionné pour moi (en ignorant évidemment les suggestions de "redirection stderr", ce qui, à mon avis, est un mauvais conseil). J'ai choisi d'utiliser une paire d'étapes de provisioning avant / après pour inclure temporairement l' --frontend=noninteractiveoption dans la commande définie dans le fichier. sudo sed -i 's/\(dpkg-preconfigure\) --apt/\1 --frontend=noninteractive --apt/' /etc/apt/apt.conf.d/70debconfavant et sudo sed -i 's/ --frontend=noninteractive//' /etc/apt/apt.conf.d/70debconfaprès.
phils
5

La redirection Bash fonctionne bien pour stdout et stderr.

Pour rediriger le flux d'erreur, utilisez ce qui suit:

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

Pour rediriger à la fois stdout (messages qui ne sont pas des erreurs / avertissements) et stderr, utilisez:

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

C'est un raccourci disponible en bash pour ceci:

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

Ci-dessous, nous pouvons clairement voir que le descripteur de fichier 1 est 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

Donc, pour ce que vous dites que vous voulez faire, vous ne devriez avoir besoin que du tout premier commandement que j'ai donné.

Requin taureau
la source
1
Je veux pouvoir faire écho à la sortie standard d'apt-get. Mais vous pouvez avoir moi sur la bonne voie ... je vais essayer d'envoyer juste le stderr au bit-seau - Acclamations modifier: nous avons tous deux commenté en même temps lol - acclamations (encore)
Daithí
J'ai édité le post. Voir la toute dernière ligne.
BullShark