To, co vidíte, je účinek standardní vyrovnávací paměti stdout v grep poskytuje Glibc. Nejlepším řešením je deaktivovat jej pomocí --line-buffered (GNU grep, nejsem si jistý, jaké jiné implementace by jej mohly podporovat nebo něco podobného).
Pokud jde o proč k tomu dochází pouze v některých případech:
ssh server "tail -f /var/log/server.log | grep test"
spustí celý příkaz v uvozovkách na serveru - tedy grep čeká na zaplnění vyrovnávací paměti.
ssh server tail -f /var/log/server.log | grep test
běží grep na vašem lokálním počítači na výstupu tail odeslané přes ssh kanál.
Klíčovou částí zde je, že grep upravuje své chování v závislosti na tom, zda je jeho stdin je terminál nebo ne. Když spustíte ssh -t , dálkový příkaz běží s ovládacím terminálem a tedy dálkovým grep se chová jako váš místní.
podívejte se na toto:multitail
MultiTail vám umožňuje monitorovat protokolové soubory a výstup příkazů ve více oknech v terminálu, vybarvovat, filtrovat a slučovat.
Chcete-li sledovat protokoly na více serverech, použijte:
multitail -l 'ssh [email protected] "tail -f /path/to/log/file"' -l 'ssh [email protected] "tail -f /path/to/log/file"'