Tenho 2 aplicativos que canalizam seus dados:
aplicação1 | aplicação2
Basicamente, application1 gera um log com eventos que application2 processa. O problema é que eu frequentemente atualizo application2. Ou seja, eu preciso parar isso, atualizar os binários e reiniciá-lo. Nessa pequena duração application1 pode perder dados.
Li sobre usar pipes nomeados usando mkfifo
e pensei que poderia ser uma solução ideal. Mantenha o application1 em execução e faça com que ele grave no pipe nomeado com suporte de arquivo para que, quando o aplicativo for atualizado, nenhum dado seja perdido e, quando o application2 iniciar, ele obtenha os dados.
Testar isso com cat
para emular leitor/escritor funciona até que não haja mais um leitor. Isso é inesperado.
Uma alternativa seria usar um arquivo real, mas isso tem problemas:
- Ele permanece no disco e não age como FIFO
- É necessário algum tipo de rotação para evitar que os arquivos fiquem muito grandes
- AFAIK quando o leitor estiver no final (cauda?), será necessário sondar atrás de um cronômetro se o arquivo tiver aumentado de tamanho, o que aumentou a latência do processamento
Estou no controle do leitor, o comportamento atual já é que ele irá reiniciar automaticamente, mas não estou no controle do escritor. Só posso canalizar sua saída para outra coisa.
- Os pipes nomeados podem ser configurados de forma que sejam duráveis?
- Li sobre "fixar" no tubo pelo escritor, mas não consigo fazer isso funcionar
- Posso evitar que um pipe seja fechado quando o leitor sair?
- Existem alternativas que se comportam como um cano?
A solução https://unix.stackexchange.com/a/784153/585995 funciona!
mkfifo /tmp/mypipe
writerapp 1<>/tmp/mypipe
O escritor continua em execução enquanto eu reiniciaria o leitor:
readerapp </tmp/mypipe
a propósito, você pode testar isso sozinho usandocat