Quello che vedi è l'effetto di un buffer stdout standard in grep
fornito da Glibc. La soluzione migliore è disabilitarlo usando --line-buffered
(GNU grep, non sono sicuro di quali altre implementazioni potrebbero supportarlo o qualcosa di simile).
Quanto al perché questo accade solo in alcuni casi:
ssh server "tail -f /var/log/server.log | grep test"
esegue l'intero comando tra virgolette sul server, quindi grep
attende di riempire il proprio buffer.
ssh server tail -f /var/log/server.log | grep test
esegue grep
sulla tua macchina locale sull'output tail
inviato attraverso il canale ssh.
La parte fondamentale qui è che grep
regola il suo comportamento a seconda che sia stdin
è un terminale o no. Quando esegui ssh -t
, il comando remoto è in esecuzione con un terminale di controllo e quindi il grep
remoto si comporta come quello locale.
dai un'occhiata a questo:multitail
MultiTail ti consente di monitorare i file di registro e l'output dei comandi in più finestre in un terminale, colorare, filtrare e unire.
Per accodare i log in più server utilizzare:
multitail -l 'ssh [email protected] "tail -f /path/to/log/file"' -l 'ssh [email protected] "tail -f /path/to/log/file"'