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"'