Vynulovani velikosti souboru

Míla Kuchta mila.kuchta na atlas.cz
Sobota Září 2 06:15:54 CEST 2000


Jacek Kopecky <kopeckyj na inf.upol.cz> napsal:
>  > >> > co udelat radsi neco jako:
>  > >> >     cat xxx.log|tail -n100 >xxx.log
>  > >> > aby Vam v novem logu zbylo par (100) radku ze stareho
>  > >> 
>  > >> A jsi si jisty, ze by takovy postup fungoval?
>  > >> IMHO by se musel pouzit docasny soubor.
>  > > 
>  > > Tak si to zkuste, uvidite, ze to skutecne funguje. Nevim, jak je to
>  > > mozne, ale minimalne v Bashi to jde. Podstatne je, ze je tam ta roura,
>  > > pokud byste dal primo tail -n100 xxx.log >xxx.log tak to soubor xxx.log
>  > > vynuluje. 
>  > 
>  > To je zajimave. Ja myslel, ze prvni je vzdy execnut konzument. Muze to nekdo
>  > objasnit.
> 
> Tohle opravdu musi zaviset na casovani, protoze zaroven probihaji
> nasledujici dve veci:
> 1) cat otevira soubor xxx.log pro cteni
> 2) bash otevira soubor xxx.log pro zapis, zkracuje ho a dava ho tailu
> jako std. vystup
> 
> No a pokud cat stihne precist tech prvnich 100 radku ve svem prvnim
> kvantu nebo jeste driv, pak to funguje. 

No, teoreticky by to melo byt asi takto:
1. shell se forkne a execne tail
2. tail se forkne a pipne cat
3. shell zavre (dup()) puvodni filedescriptory a otevre nove
  - tady mozna bude ta finta
  - zalezi na tom v jakem poradi to probehne
  - cat totiz ten soubor musi nejak zamknout, nebo ulozit lokalni kopii,
  jelikoz vetsinou pracuje jen s 512 byty.
4. konzument zacne cist
5. producent zacne zapisovat.
....

Nerekl bych, ze to to shell osetruje, takze to takhle nejak musi fungovat,
pokud to tedy neni vlastnost jadra, ktere ten soubor fyzicky ihned nezapise,
ale zapise je az pri zadosti o uzavreni descriptoru.

Mila Kuchta


Další informace o konferenci Linux