Fórum Root.cz
Hlavní témata => Software => Téma založeno: mikesznovu 07. 01. 2023, 20:09:33
-
je nějaký důvod proč třeba conntrack -L | grep tcp vrací mezi mrakem řádků obsahujících tcp (v mém případě 50) řádek "flow entries have been shown" v náhodném pořadí pokaždé ?
conntrack -L 2&>1 | grep tcp dává paradoxně výsledek někde uprostřed, ale konzistentně vůči samotnému výstupu stdout.
zaprvé, je tohle nějaká zvláštnost shellu, terminálu nebo ?i? programu conntrack (který to třeba vypisuje ve vláknech) a nebo dokonce grepu?
-
Myslim ze conntrack a grep bezia paralelne. conntrack vypisuje riadky bud na stdout alebo stderr, a tie sa hned spracovavaju.
V prvom pripade stdout ide do rury do grepu a az potom na terminal, a stderr z conntrack ide rovno na terminal. Takze zavisi od casovania v grepe, kam do stdout ten stderr trafi (inac povedane, grep sposobi nejake zdrzanie pre riadky zo stdout).
V druhom pripade stderr sa synchronne spoji so stdout, potom sa to cele posle ako jeden stream stdout do grepu, a nakoniec na terminal. grep urobi rovnake zdrzanie pre stdout aj pre stderr, (lebo riadky povodne z stderr su v stdout), a takisto na terminal idu spolu.
Trochu to cele moze skomplikovat to, ako sa jednotlive streamy flushuju - moze to premiesat poradie, ale system sa nezmeni.
-
Celé je to jen otázka paralelismu.
Jednotlivé příkazy spojené přes rouru běží paralelně, přesně jak píše Jano. A v tomhle případě nečekají na uzavření vstupu - grep to bere, jak to přijde a hned posílá dál. Což ale přidá latenci, a když stderr jde mimo grep, tak bude záležet na náhodě, jak se to načasuje.
Pokud ten řetězec "flow entries have been shown" má být na konci a po spojení stdout a stderr ho to dává někam doprostřed, tak to bude asi způsobené tím, že conntrack flushne stdout až úplně na konci svého běhu, a pro velké množství textu to vyprázdnění cache nějakou dobu trvá. Zatímco stderr se flushne synchronně hned (a nebo je prostě jen málo dat v stderr cache a tak to doběhne hned). A tím pádem se to promíchá.
-
Napadá mě hack | tac | tac, který musí bufferovat výstup v RAM, a poslat ho, až bude vše hotové. Asi to půjde i nějak čistěji.