Como Rubo77 mencionou, o problema é resolvido adicionando o --line-buffered
ao primeiro comando grep:
tail -f /var/log/syslog|grep --line-buffered s|grep s
No entanto, você pode perguntar por que isso não é necessário para um único comando grep
? A diferença entre os dois é que no seguinte comando:
tail -f /var/log/syslog|grep s
STDOUT
para grep é apontado para um terminal. grep
provavelmente grava em STDOUT
via funções contidas na biblioteca stdio. De acordo com a documentação ( stdio (3) ):
Output streams that refer to terminal devices are always line buffered by default;
Assim, as chamadas de biblioteca subjacentes estão liberando o buffer após cada linha sem qualquer ação na parte do grep.
Neste comando:
tail -f /var/log/syslog|grep --line-buffered s|grep s
STDIO
agora está indo para um pipe em vez de um dispositivo de terminal e as funções de biblioteca que o grep está usando para gravar em STDOUT armazenam completamente essas gravações em vez de usar o buffer de linha. Quando o sinalizador --line-buffered
é usado, o grep chamará fflush
, que liberará toda a gravação em buffer.