egy shell-script kérdés ✓

 ( tomaza | 2008. augusztus 29., péntek - 14:33 )

hogy lehetne

while [ 1 ]; do wc -l filename; sleep 60; done

anélkül hogy előlről kellene beolvasnia, ha a folyamatosan a végére ír valami a filename-nek?

ps: jó lenne sh-ban, de (powershell kivételével) akármiben lehet

pps: megfogalmazom szövegesen is: egy log fájl percenkénti növekménye kell, sorokban.
(Mivel log fájl, nem percenként beolvasva az egész fájlt.)

nem tudom szabad-e a tárgyba unicode karaktert tenni..

Hozzászólás megjelenítési lehetőségek

A választott hozzászólás megjelenítési mód a „Beállítás” gombbal rögzíthető.

kicsit más, de:

$ tail -f filename

szerk: bocs a -f elkerülte a figyelmem:)

Nem tudom mire kell, azért írtam a tail-t..
Szóval mire kell?

arra amit írtam, a tail -f jónak tűnne bár még nem jöttem rá hogy kellene használni

$ touch test
$ tail -f test

--
másik terminálon:
$ while true; do date >> test; sleep 10; done

de a sleep alatt akármennyi touch lehet

nem értem
a filename-be egy ismeretlen program
- néha ilyet hajt végre: "echo hali >>filename" v. "tee -a filename"
- egy "tee filename" mindvégig rajta van
mindkettőre érdekelne megoldás de az igazi az lenne ha ettől független lenne

pontosabban a wc és a sleep helyére képzelhetsz más programot, a lényeg hogy a wc a tartalmát olvassa, a sleep alatt pedig idő telik el
szerk: persze úgy olvassa a wc helyén lévő program hogy elég lenne neki a a program legutolsó futása utáni a fájlhoz hozzáírt adat

lc=0
while read line <file; do
  lc=$(expr $lc + 1)
  sleep 60s
done

Valami ilyesmi esetleg?

ez nem soronként vár egy percet?

De... hm. Lassunk egy masik megoldast...

Elso lepesben megnezzuk a file meretet, es megszamoljuk a sorokat, ez a kiindulopont. Utana alszunk egy percet, megnezzuk a file meretet (stat?), kivonjuk belole az elozot, ennyivel nott a merete. Jajjdejo! De ugye sorokban kell nekunk, hat tail -c ${kulonbozet} | wc -l. Ennyivel nott az eltelt egy perc alatt a file sorainak szama.

Shellben, kb a fenti, picit optimalizalva:

fs=$(stat -c '%s' ${file})
while 1; do
  sleep 60s
  lcd=$(tail -c +${fs} ${fs} | wc -l)
  fs=$(stat -c '%s' ${file})
done

Ha minden igaz akkor $lcd-ben van hogy hany sor kerult hozza a filehoz az elmult percben. Lehet, hogy -c +$(expr $fs + 1) kell, nem teljesen vilagos a man oldal. De valami ilyesmi ;)

- naív mo lehetne a "tail -c $a|wc -l; a=`fájlméret file`; sleep 60" de akkor mi garantálja hogy a wc és a fájlméret parancs közt nem volt növekmény

- a read line-os változatot nem sikerült átfaragnom működőképesre

- a "tail -f"-et továbbra sem értem

Semmi sem garantalja. Azt lehet meg betenni, hogy tail elott megnezed a file meretet, tail -c +${elozomeret}, ezt lelimitalod $meret-$elozomeret -re, es ugy wc -l. Ez megved a csuszastol.

tail -c +${elozomeret} | head -c $(expr ${meret}-${elozomeret}) | wc -l
elozomeret=${meret}

jónak tűnik, de még gondolkozom egy szebb megoldáson:)

jól értem a "tail -f"-et hogy az a feladatot oda egyszerűsíti hogy a bemeneti fájl egy csővezeték kimenetévé egyszerűsödik?
tehát a "tail -c +0 -f fájl"-t kellene használni, de hogyan?

Ha nem feltétlen shellscript kell, akkor a logtail pontosan erre való.

man logtail:
logtail reads a specified file (usually a log file) and writes to the standard output that part of it which has not been read by previous runs of logtail. It prints the appropriate number of bytes from the end of logfile, assuming that all changes that are made to it are to add new characters to it.

eredetileg bármi jó lenne, de mivel egy ilyen egyszerű feladatot nem sikerült kapásból megoldanom, kihívás lett belőle:)
ps: kösz a logtailt, így megtaláltam a logtools-t is:) , perszea kihívás továbbra is fennáll:)

Talán így:

tail -c +0 -f logfajl >> tempfajl &

while [ 1 ] ; do
        wc -l tempfajl
        :> tempfajl
        sleep 60
done

ez szépnek tűnik:) (a tempfájl kivételével:)
de mi az a kettőspont? tudom rtfm de azért :-ra kicsit nehéz rékeresni
ps: ha a wc és a tempfile kinullázása közt volt növekmény? vagy rosszul értelmezem a scripted?

Hasonló az echo "" > -hoz csak nem rak sortörést a végére.

nem a true alias-a?

Azt hiszem ez lesz az (a man bash-ból):

SHELL BUILTIN COMMANDS

: [arguments]
No effect; the command does nothing beyond expanding arguments and performing any specified redirections. A zero exit code is returned.

De lehet hogy rosszul értem:)

> ez szépnek tűnik:) (a tempfájl kivételével:)
meg a race condition és az egyre lassuló futás kivételével...

Miért lassulna le? Hogyan lehetne kivédeni race conditiont?

Ez kell neked, csak akkor írja bele a file új méretét a file.size-ba, ha volt új sor:


$ tail -n +0 -f file |
(size=0; while read; do let size++; echo $size > file.size; done) &
$ while true; do cat file.size; sleep 60; done

pont ilyet álmodtam:)

Ez egy picit races, nem?

Ha epp akkor catolodna a file amikor echo ir bele, akkor elofordulhat - bar igen valoszinutlen ilyen egybeeses -, hogy a tempfile epp 0 meretu, nem?

Szemely szerint en nem szeretem a tempfileokat, inkabb legyen egy picit hosszabb a kod, background process es tempfile nelkul.. De izlesek es pofonok :)

size=0
tail -n +0 -f file | (while read; do let size++; done) &
while true; do echo $size; sleep 60; done

?

btw: policy mit mond, címbe lehet ilyet szúrni: ✓ ✔ ?