Linux: Для "tail -f filename", следующие строки чтения только после \ n? - PullRequest
3 голосов
/ 15 апреля 2011
Initial File:
line 1
line 2
line 3

File after append 1:
line 1
line 2
line 3
lin

File after append 2:
line 1
line 2
line 3
line 4

Если я выполняю «tail -f filename», а затем файл обновляется, как указано выше,

Следует ли tail за обновлениями на половину строки или он возвращает только атомные строки?

т.е.

Я гарантированно вижу / не вижу "lin" после добавления 1?Если после "строки 4" нет \ n, я увижу это?

В частности, меня интересует, могу ли я читать атомарные строки.Я запускаю приложение для мониторинга журналов и хочу только проанализировать полные строки.Файлы журналов могут быть обновлены до половины строки, и если tail не гарантирует атомарные строки, мне придется защититься от этого (т.е. прочитать символ за символом, а затем определить строку, когда я вижу \ n).

Ответы [ 3 ]

1 голос
/ 15 апреля 2011

На моем Mac (9.8.0 Darwin Kernel Version 9.8.0) встроенный tail показывает символы, добавленные в файл. Вот небольшой тест:

import sys, time

def write(fname):
  fd = open(fname, 'wb')
  try:
    while True:
      for i in range(0, 5): 
        fd.write('a')
        fd.flush()
        print >>sys.stderr, "Wrote a char"
        time.sleep(2)
      fd.write('\n')
      fd.flush()
      print >>sys.stderr, "Wrote newline"
      time.sleep(2)
  finally:
    fd.close()

if __name__ == '__main__':
  write(sys.argv[1])

Выполнить: python test.py test.txt, а затем tail -f test.txt. Это показывает появление а-с.

0 голосов
/ 15 апреля 2011

Дело в том, что существует буферизация.

Хвост, вероятно, будет делать буферизацию, но источником может быть линейная буферизация.Если источник находится под вашим контролем, попробуйте отключить буферизацию вывода и посмотрите, как это происходит

0 голосов
/ 15 апреля 2011

В соответствии с man-страницей:

-f, --follow[={name|descriptor}]
          output appended data as the file grows; -f, --follow, and --follow=descriptor are equivalent

, что означает, что вы будете видеть каждый символ в том виде, в каком он добавлен, а не только в новой строке.Тем не менее, я полагаю, что tail использует какую-то стратегию очистки, поэтому то, что вы видите, может зависеть от скорости обновления файла.Я могу только предложить вам немного поэкспериментировать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...