Linux dosya çılgınlık - garip davranış log dosyasının son satırını alıyorum

2 Cevap php

I am trying to get the last line of a file. The file, ff.log, is getting new data every second while ffmpeg is working. The log file looks like this:

frame= 20 fps= 0 q=7.7 size= 40kB time=1.24 bitrate= 266.1kbits/s
frame= 30 fps= 28 q=6.6 size= 51kB time=1.90 bitrate= 218.4kbits/s
frame= 40 fps= 24 q=6.6 size= 61kB time=2.60 bitrate= 191.4kbits/s
frame= 47 fps= 20 q=6.8 size= 65kB time=3.08 bitrate= 173.8kbits/s
frame= 64 fps= 22 q=7.0 size= 84kB time=4.20 bitrate= 163.8kbits/s
(keeps adding new lines every second or faster)

Ben denedim

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

Ben bir "php tail script" ile fseek () kullanarak çalıştı.

Hem bazı garip davranış sonuçlandı.

Ben komut satırından benim komut koştu ve outputted:

frame= XX fps= XX q=XX size= XX time=XX bitrate= XXkbits/s

Bu son satırından değer kadar XX birkaç saniye boyunca artmaya devam nerede.

Şimdi, benim php komut dosyası, ben var

echo "--$last_line--";

Onu çalıştırdığınızda, çıktı, birkaç saniye boyunca artan sayıları ile sadece günlük hattıdır. Bu sonuna ulaştığında zaman çıktı

- Ame = 7119 fps = 9 q = 13.8 boy = 4809kB süresi = 474,50 bit = 83.0kbits / s

Not ilk "-" $ last_line ve diğer çarpıştı "-" yok.

Bu garip davranış için açıklama nedir?


2 Cevap

Eğer "$ lastline -" yazdırmak için onu soruyorsun düşünüyor çünkü bu muhtemelen ...

Denemek

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

ayrıca gibi bir şey yapmak isteyebilirsiniz

var_dump($lastline); die();

Bu size daha fazla bilgi verecek gibi, değişkeni içinde tam olarak ne olduğunu göstermek için.

Ancak, ben size bütün komut göndermek önermek, bu yüzden birisi denemek ve ne sorunu olduğunu görebilirsiniz.

EDIT dosyasına bakıldığında, bunun bir satır sonlandırıcı olarak SADECE \ r kullanıyor görünüyor. Bu (o "satırın başlangıcına dönmek" anlamına gelir) bakın sorunlara neden - bu günlüğüne tüm son satırı olarak gösteriyor demektir.

Denemek using he command

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

günlüğünün son satırı almak için.

Both the tail command and the PHP script have the same problem. They seek to the end of the file, back up to the previous end-of-line, then read and print everything from there to the end of the file.

Dosya çok hızlı büyüyor değilse bu iyi. Dosya hızla büyür birden fazla satır geri almak.

Bunlardan birini deneyin:

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

İlk biraz daha doğrudur, ancak ikinci hızlıdır.