No momento, estou redirecionando a saída de uma ferramenta de monitoramento para um arquivo, no entanto, o que eu gostaria de fazer é redirecionar essa saída para um novo arquivo na minha solicitação (usando uma combinação de teclas), sem interromper a referida ferramenta.
Algo como
monitor_program | handle_stdout
Onde handle_stdout
me permite definir um novo arquivo onde colocar o log em determinado ponto.
Eu sei que poderia escrevê-lo facilmente, mas estou me perguntando se existe alguma ferramenta que já permita isso.
bash
pipe
io-redirection
stdout
Treviño
fonte
fonte
logrotate
manualmente um arquivo de configuração personalizado, dependendo do comportamento do seu monitor_program, mas isso é um tanto imprudente.Respostas:
Vou sugerir um pipe nomeado.
Crie um canal
mkfifo p
(chame-o como quiser, se não for 'p')Crie um script de "leitor" que leia do canal e grave onde quiser
Diga ao programa de monitoramento para gravar seus logs no canal nomeado
Aqui está um script de leitor de amostra que lê de um canal nomeado 'p' e grava os dados em um arquivo 'mylog' indexado:
fonte
read
e emprintf
vez de apenascat <p >> mylog."$INDEX"
?Desenvolvendo sua ideia SIGINT, aqui usando SIGQUIT (Ctrl+\ ), você ainda pode usar Ctrl+Cpara parar a coisa toda:
Isso pressupõe que
cat
não está embutido no seu shell (então ele é interrompido por você pressionar Ctrl+\).Observe que, como em sua abordagem, há uma chance de que o SIGQUIT seja entregue no momento errado (na chamada do sistema de gravação), causando a perda de alguns dados.
fonte
Você provavelmente poderia usar
less
e salvar a partir daí, digitando so nome do arquivo no qual deseja salvar Enter. De Como escrevo todas as linhas de menos para um arquivo? .fonte
Sem saber mais sobre o seu "pedido", não é realmente possível responder. Se fosse baseado no tamanho ou no intervalo do arquivo, os rotatelogs (que devem vir com o Apache httpd) funcionarão.
fonte
Graças à resposta de Jeff Schaller , acabei com algo assim, que basicamente faz o que eu preciso, vamos chamá-lo
reader.sh
:Então, trata-se de criar um pipe nomeado com
mkfifo p
e usar dois terminais ondemonitor_program > p
e emreader.sh
execução. Posso parar o leitor para definir um novo log usando Ctrl+ Ce inserir um novo nome. Ctrl+ Z, como sempre, para parar e matá-lo.fonte