Para algumas máquinas na nuvem que estou iniciando, estou tentando fazer logon em um arquivo específico, syslog e no terminal / console.
Na parte superior dos scripts de configuração da máquina / cloud-init, tenho o seguinte:
#!/bin/bash
exec &> >(tee "/tmp/box-setup.log" | logger -t box-setup)
apt-get install -y some-package
Isso funciona muito bem no envio de saída para um arquivo e syslog, mas não canaliza a saída para o terminal.
De um modo geral, não ter saída de terminal não é um grande problema, exceto quando estou depurando de um console remoto. Quando isso acontece, fico completamente cego porque o console está em branco enquanto o script bash é executado.
Existe uma maneira simples de usar o bash
redirecionamento ou o que quer que seja para canalizar toda a saída (saída padrão e erro padrão) para um arquivo, syslog e o terminal simultaneamente?
Estou executando o Ubuntu 16.04.
fonte
exec &> >(tee /tmp/box-setup.log >(logger -t box-setup))
Você pode resolver esse problema de uma maneira diferente: execute seu script bash em segundo plano e execute
less /tmp/box-setup.log
e pressione F para continuar atualizando a tela à medida que as linhas são adicionadas ao arquivo que está assistindo (comotail -f
).Se a execução do script em segundo plano for um problema, use
tmux
ouscreen
para obter várias sessões multiplexadas em uma conexão ssh. Use o mesmoless
comando em outro shell.O problema original:
tee
pode copiar para vários destinos. Faça de um deles o terminal, usando o/dev/tty
arquivo especial. Eu acho que sempre se refere ao controle do processo atual. Ou provavelmente melhor,/dev/stderr
poistee
o stderr do s ainda está conectado ao stderr do shell. (Isso permite silenciar o script com &> / dev / null).BTW, isso é equivalente a, mas mais eficiente que
(tee /dev/stderr | tee "/tmp/box-setup.log" | logger ...)
.Seria possível usar alguma clonagem de descritor de arquivo para fornecer
tee
o stdout do script original, em vez do stderr.fonte
Basta adicionar
/dev/stderr
(sua escolha) como uma saída paratee
.A saída padrão e o erro padrão serão mesclados. Não há como mantê-los separados se você quiser preservar a ordem deles, o que geralmente é desejável. Não importa se os dois estão indo para o mesmo local (por exemplo, o terminal).
fonte
tee
stdout é o pipe para o logger, não o terminal. Éstderr
nesse ponto que ainda é o terminal, com base noexec &> >(tee /dev/stderr > /dev/null)
trabalho esperado em um shell interativo.stderr
parece uma ideia melhor do que a minha/dev/tty
, pois permite que você feche facilmente o script com um redirecionamento, se desejar.