Сумасшествие файла Linux - странное поведение, получающее последнюю строку файла журнала - PullRequest
1 голос
/ 06 августа 2009

Я пытаюсь получить последнюю строку файла. Файл ff.log получает новые данные каждую секунду, пока работает ffmpeg. Файл журнала выглядит следующим образом:

кадр = 20 кадров в секунду = 0 q = 7,7 размера = 40 КБ времени = 1,24 битрейта = 266,1 Кбит / с
кадр = 30 кадров в секунду = 28 q = 6,6 размера = 51 кБ времени = 1,90 битрейта = 218,4 кбит / с
кадр = 40 кадров в секунду = 24 q = 6,6 размера = 61 кБ времени = 2,60 битрейта = 191,4 кбит / с
кадр = 47 кадров в секунду = 20 q = 6,8 размера = 65 кБ времени = 3,08 битрейта = 173,8 кбит / с
кадр = 64 кадра в секунду = 22 q = 7,0 размера = 84 кБ времени = 4,20 битрейта = 163,8 кбит / с
(продолжает добавлять новые строки каждую секунду или быстрее)

Я пытался

$line = `tail -n 1 $file`;

Я пытался использовать fseek () с " php tail script ".

Оба привели к странному поведению.

Я запустил мой скрипт из командной строки, и он вывел:

frame = XX fps = XX q = XX size = XX время = битрейт XX = хкбит / с

Где XX продолжал увеличиваться в течение нескольких секунд, пока не стало значение из последней строки.

Теперь, в моем PHP-скрипте у меня есть

echo "--$last_line--";

Когда я запускаю его, вывод происходит в течение нескольких секунд, просто строка журнала с увеличивающимися числами. Когда он достигает конца, вывод равен

- ame = 7119 кадров в секунду = 9 q = 13,8 размера = 4809 кБ времени = 474,50 битрейта = 83,0 кбит / с

Обратите внимание, что первый "-" столкнулся с $ last_line, а другой "-" не существует.

Чем объясняется это странное поведение?


Ответы [ 2 ]

3 голосов
/ 06 августа 2009

Вероятно, это потому, что вы думаете, что вы просите напечатать "$ lastline--" ...

Попробуйте

echo '--' . $lastline . '--';

Вы также можете захотеть сделать что-то вроде

var_dump($lastline); die();

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

Тем не менее, я предлагаю вам опубликовать весь сценарий, чтобы кто-то мог попытаться выяснить, в чем проблема.

РЕДАКТИРОВАТЬ Глядя на файл, кажется, что он использует ТОЛЬКО \ r в качестве ограничителя строки. Это вызывает проблемы, которые вы видите (это означает «возврат к началу строки») - это означает, что весь журнал отображается как последняя строка.

Попробуйте использовать команду

cat ff.log | tr "\r" "\n" | tail -n 2 | head -n 1

чтобы получить последнюю строку журнала.

0 голосов
/ 06 августа 2009

У команды tail и PHP-скрипта одна и та же проблема. Они ищут конец файла, возвращаются к предыдущему концу строки, затем читают и распечатывают все оттуда до конца файла.

Хорошо, если файл не очень быстро растет. Когда файл быстро растет, вы получаете несколько строк.

Попробуйте любой из этих:

$line = `tail -n 1 $file | tail -n 1`;
$line = `tail -n 1 $file | head`;

Первое немного точнее, а второе быстрее.

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