Pour certaines machines cloud que je lance, j'essaie de me connecter à un fichier spécifique, syslog et le terminal / console.
En haut de mes scripts de configuration de machine / cloud-init, j'ai les éléments suivants:
#!/bin/bash
exec &> >(tee "/tmp/box-setup.log" | logger -t box-setup)
apt-get install -y some-package
Cela fonctionne très bien pour envoyer la sortie vers un fichier et un syslog, mais cela ne dirige pas vers la sortie vers le terminal.
D'une manière générale, ne pas avoir de sortie de terminal n'est pas un problème énorme, sauf lorsque je débogue à partir d'une console distante. Lorsque cela se produit, je suis complètement aveugle car la console est vide pendant l'exécution du script bash.
Existe-t-il un moyen simple d'utiliser la bash
redirection ou autre pour diriger simultanément toutes les sorties (sortie standard avec erreur standard) vers un fichier, un journal système et le terminal?
J'utilise Ubuntu 16.04.
la source
exec &> >(tee /tmp/box-setup.log >(logger -t box-setup))
Vous voudrez peut-être résoudre ce problème d'une manière différente: exécutez votre script bash en arrière-plan, puis exécutez
less /tmp/box-setup.log
et appuyez sur F pour continuer à mettre à jour l'écran lorsque des lignes sont ajoutées au fichier qu'il regarde (commetail -f
).Si l'exécution du script en arrière-plan pose problème, utilisez
tmux
ouscreen
pour multiplexer plusieurs sessions sur une connexion ssh. Utilisez la mêmeless
commande dans un autre shell.Le problème d'origine:
tee
peut copier vers plusieurs destinations. Faites de l'un d'eux le terminal, en utilisant le/dev/tty
fichier spécial. Je pense que cela fait toujours référence au contrôle du processus actuel. Ou probablement mieux,/dev/stderr
puisquetee
le stderr de est toujours connecté au stderr du shell. (Cela vous permet de désactiver le script avec &> / dev / null).BTW, c'est équivalent mais plus efficace que
(tee /dev/stderr | tee "/tmp/box-setup.log" | logger ...)
.Il serait possible d'utiliser un clonage de descripteur de fichier pour donner
tee
la sortie standard du script original, plutôt que la sortie stderr.la source
Ajoutez simplement
/dev/stderr
(votre choix) comme sortie àtee
.La sortie standard et l'erreur standard seront fusionnées. Il n'y a aucun moyen de les séparer si vous souhaitez conserver leur ordre, ce qui est généralement souhaitable. Peu importe qu'ils se rendent tous les deux au même endroit (par exemple, le terminal) de toute façon.
la source
tee
La sortie standard est le tuyau vers l'enregistreur, pas le terminal. C'eststderr
à ce moment-là que se trouve le terminal, basé sur leexec &> >(tee /dev/stderr > /dev/null)
fonctionnement comme prévu dans un shell interactif.stderr
semble être une meilleure idée que mon/dev/tty
idée, car elle vous permet de fermer facilement le script avec une redirection si vous le souhaitez.