Náhodné pořadí grep stdout +stderr

Náhodné pořadí grep stdout +stderr
« kdy: 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?
« Poslední změna: 07. 01. 2023, 23:27:26 od Petr Krčmář »


Re:grep stdout +stderr náhodné pořadí
« Odpověď #1 kdy: 07. 01. 2023, 20:42:46 »
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.

Zopper

  • *****
  • 657
    • Zobrazit profil
Re:Náhodné pořadí grep stdout +stderr
« Odpověď #2 kdy: 09. 01. 2023, 11:58:35 »
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á.

Re:Náhodné pořadí grep stdout +stderr
« Odpověď #3 kdy: 11. 01. 2023, 12:22:23 »
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.