É possível criar um stream personalizado?

É possível criar um stream personalizado?

Não tenho certeza de qual terminologia usar aqui, então tenha paciência comigo.

Estou escrevendo um aplicativo que produzbastantede registros. Achei que seria legal poder fazer com que meu aplicativo transmitisse os logs para fooe permitir que outros processos lessem foocomo se fosse um fluxo (como /dev/random).

Ou seja, eu gostaria apenas de transmitir logs continuamente em algum lugar (sem ter que me preocupar com coisas do sistema de arquivos, como arquivamento, exclusão, etc.) e ter a capacidade de outros processos "acessarem" esse fluxo como se fosse algum interminável arquivo.

Como faço para fazer isso? O que é foo?

Idealmente:

terminal 1
> mkthing foo
> while :; do echo 'abcdefg' >> foo; sleep 1; done

terminal 2
> echo foo
(outputs "abcdefg" every second)

Responder1

A maneira absolutamente normal de ver os logs égrave-os em um arquivo. Quando quiser ver os logs, leia o arquivo. Para observar as linhas conforme elas são anexadas ao arquivo, use um comando comotail -f, que, após chegar ao final do arquivo, o mantém aberto e observa linhas extras anexadas a ele. A opção -fé para “seguir”, e emmenosvocê pode ter o mesmo efeito com Ffor ”follow“; em outros programas, isso pode ser conhecido como “seguir” um arquivo porque tailé o utilitário clássico que faz isso. Vera tailtag neste sitepara obter mais informações sobre utilitários de cauda.

Se você absolutamente não deseja gravar os logs em um arquivo, você pode executar o aplicativo emtelaoutmux. Para rodar /usr/bin/my_application --some-optionem segundo plano, com tela:

screen -S myapp -d -m /usr/bin/my_application --some-option

Para assistir aos registros:

screen -S myapp -d -r

Pressione Ctrl+ A dpara desconectar, ou seja, para parar de observar os registros. Enquanto observa os logs, você também pode enviar informações para o aplicativo, o que pode ou não ser desejável. Para conceder acesso somente leitura, consulteExiste uma maneira de executar a 'tela' no modo somente leitura?

Com tmux, para iniciar o aplicativo:

tmux new-session -s myapp -d /usr/bin/my_application --some-option

Para visualizar os registros mais recentes:

tmux attach -r -t myapp

Pressione Ctrl+ A dpara desconectar. Execute tmux attachsem -rpoder interagir com o aplicativo.


Atubo nomeadonão é o que você quer. Só estou mencionando isso porque superficialmente parece apropriado (e enquanto escrevo, está aparecendo nos comentários). Ele fará o que você descreve:

mkfifo foo
while :; do echo 'abcdefg' >> foo; sleep 1; done

em paralelo com

cat foo

Não é isso que você deseja porque deve haver exatamente um leitor. Se não houver leitor, o lado da escrita será bloqueado. Se houver vários leitores, cada linha (ou pedaço, dependendo de como o programa produz a saída) será vista por exatamente um leitor, escolhido mais ou menos aleatoriamente. Se houver um leitor e ele desaparecer, o lado da escrita não conseguirá escrever e receberá um SIGPIPE se não os tiver desabilitado.

informação relacionada