Note que um fifo é normalmente necessário na programação, onde a quantidade escrita pode ultrapassar a quantidade lida.
Como tal, um fifo não funciona perfeitamente como você antecipa, mas resolveria seu problema principal enquanto introduzia outro.
Existem três possíveis advertências.
- Escrever no fifo é bloqueado indefinidamente se nada estiver lendo o outro lado na inicialização.
- O fifo tem uma largura fixa de 64K, pela qual, se o buffer for preenchido até esse ponto, gravações adicionais serão bloqueadas até que o leitor tenha captado.
- O gravador de cachimbos será morto com SIGPIPE se o leitor morrer ou sair.
Isso significará que seu problema (emulação de E / S armazenada em buffer em uma gravação sem buffer) será resolvido. Isso porque o novo 'limite' em sua FIFO se tornará, com efeito, a velocidade de qualquer utilitário que esteja gravando o que está no pipe para o disco (que presumivelmente será o buffer de E / S).
No entanto, o escritor se torna dependente do seu leitor de log para funcionar. Se o leitor parar de ler, o escritor irá bloquear. Se o leitor de repente sair (digamos que você fique sem espaço em disco no seu destino), o gravador irá SIGPIPE e provavelmente sairá.
Outro ponto a ser mencionado é que, se o servidor entrar em pane e o kernel parar de responder, você poderá perder até 64k de dados que estavam nesse buffer.
Outra maneira de corrigir isso é gravar logs em tmpfs (/ dev / shm no linux) e ajustar a saída para um local de disco fixo. Há limites menos restritivos na alocação de memória ao fazer isso (não 64K, normalmente 2G!), Mas pode não funcionar se o gravador não tiver uma maneira dinâmica de reabrir os arquivos de log (você teria que limpar periodicamente os logs do tmpfs). Se o servidor entrar em pane nesse método, você poderá perder muito mais dados.