nixp.ru v3.0

23 октября 2017,
понедельник,
16:34:14 MSK

DevOps с компанией «Флант»
propeller написал 11 ноября 2005 года в 00:38 (344 просмотра) Ведет себя как мужчина; открыл 53 темы в форуме, оставил 158 комментариев на сайте.

Ставил я у себя программу, которая читала файлы журналов, да вот только она была на перле и потому ела больше памяти, чем мне хотелось бы, да еще и как-то странно себя вела со временем (swatch — описывал ее перлы в разделе Unix FAQ).

Видимо придется писать свою. потому и интересуеюсь, а как читать все новые поступления в файл.

Uncle Theodore

tail -f

А вообще — открывай файл, да и читай время от времени… :-)

Good Luck,

UT

propeller

в том-то и дело, что хотелось бы обойтись быстрее, чем просто открывать, да закрывать все время.

Но tail на самом деле это и делает?

Master

Настрой под себя logcheck

propeller

У меня не дебиан! К тому же он тоже, как я понял, использует перл. Это мне не нравится, потому все время будет висеть перл вприбавок ко всему.

Да и хочется уже просто свое написать, чтобы не мучаться потом. просто знать наверное, что все работает.

Лучше скажите, tail устроен как? он все время открывает и закрывает файл и сравнивает, есть ли что новое?

seiken
propeller
Лучше скажите, tail устроен как? он все время открывает и закрывает файл и сравнивает, есть ли что новое?

Нет.

$ echo «Triple Trash\nTriple Trash\nTriple Trash» > shared

$ strace tail -f shared

open(«shared», O_RDONLY|O_LARGEFILE) = 3

fstat64(3, {st_mode=S_IFREG|0644, st_size=52, …}) = 0

_llseek(3, 0, [0], SEEK_CUR) = 0

_llseek(3, 0, [52], SEEK_END) = 0

_llseek(3, 0, [0], SEEK_SET) = 0

read(3, «Double Trash\nDouble Trash\nDouble»…, 52) = 52

_llseek(3, 0, [0], SEEK_SET) = 0

read(3, «Double Trash\nDouble Trash\nDouble»…, 52) = 52

fstat64(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 0), …}) = 0

mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7c45000

write(1, «Double Trash\n», 13Double Trash

) = 13

write(1, «Double Trash\n», 13Double Trash

) = 13

write(1, «Double Trash\n», 13Double Trash

) = 13

write(1, «Triple Trash\n», 13Triple Trash

) = 13

fstat64(3, {st_mode=S_IFREG|0644, st_size=52, …}) = 0

munmap(0xb7c45000, 4096) = 0

fstat64(3, {st_mode=S_IFREG|0644, st_size=52, …}) = 0

clock_gettime(CLOCK_REALTIME, {1131735914, 524311000}) = 0

nanosleep({1, 0}, NULL) = 0

fstat64(3, {st_mode=S_IFREG|0644, st_size=52, …}) = 0

clock_gettime(CLOCK_REALTIME, {1131735915, 526541000}) = 0

nanosleep({1, 0}, NULL) = 0

fstat64(3, {st_mode=S_IFREG|0644, st_size=52, …}) = 0

clock_gettime(CLOCK_REALTIME, {1131735916, 528435000}) = 0

nanosleep({1, 0}, NULL) = 0

(потом с другой консоли дописываю в shared «Forth Trash»)

fstat64(3, {st_mode=S_IFREG|0644, st_size=65, …}) = 0

read(3, «Fourth Trash\n», 8192) = 13

write(1, «Fourth Trash\n», 13Fourth Trash

) = 13


Т.о. он открывает файл (м.б. в каком-то специальном режиме — не разбирался) и в цикле с задержкой смотрит его размер, если он изменился, выводит остаток файла. Надеюсь, дальше сам разберёшься. Вообще strace полезная штука.

Master
propeller
У меня не дебиан!

ниипаца, у меня тоже!

propeller
К тому же он тоже, как я понял, использует перл. Это мне не нравится, потому все время будет висеть перл вприбавок ко всему.

Перл он не использует.

propeller

Надо будет еще почитать, что поаниписано про эту программу. как-то я невнимательно, видимо, смотрел на зависимости и описание.

но меня все равно интересует написать ручками, а не взять готовое.

А strace спасет мир! спасибо.

Steck

Ужасы! Ну если так хоцца заново изобрести колесо то вот типо алгоритм.

Вариант 1)Делай свое детище в режиме daemon ( fork() or daemon() );

далее при запуске проверяй размер твоего файла. И через определенный интервал времени проверяй его снова. если он увиличился в размерах, то определяй на сколько

(Ну типо новый размер — исходный итд) и потом открывай его и считывай последние n байт.

Вариант 2)

Курить исходники tail и вдумыватся в них.

Вариант 3) (Работает если следится через syslog)

в /etc/syslog.conf пропиши такие строки:

Например у меня как у меня:

!ppp
*.*                                             /dev/ttyv9

И смари логи в консоли по нажатию Alt+F9 (или что там у тебя вместо ttyv9)

Вариант 4) (Самый простой)

Юзать как тебе уже посоветовали tail -f :o)

Master

Вариант 3 на Linux’е (у афтара треда похоже что Debian) не прокатит — там другой syslogd.

propeller

Если «афтаром» являюсь я, то у меня Федора.

Но можно быстрее. повесить вывод syslog еще и на один fifo файл. будет много быстрее.