2009-08-06 8 views
1

Ich versuche, die letzte Zeile einer Datei zu bekommen. Die Datei ff.log erhält jede Sekunde neue Daten, während ffmpeg funktioniert. Die Log-Datei sieht wie folgt aus:Linux-Datei Verrücktheit - seltsames Verhalten bekommen letzte Zeile der Protokolldatei

Rahmen = 20 fps = 0 q = 7,7 size = 40kB Zeit = 1,24 Bitrate = 266.1kbits/s
frame = 30 fps = 28 q = 6,6 size = 51kB Zeit = 1,90 Bitrate = 218,4 kbits/s Rahmen = 40 fps = 24 q = 6,6 Größe = 61kB Zeit = 2,60 Bitrate = 191,4kbits/s Rahmen = 47 fps = 20 q = 6,8 Größe = 65kB Zeit = 3,08 Bitrate = 173.8kbits/s
frame = 64 fps = 22 q = 7,0 size = 84kB time = 4.20 Bitrate = 163.8kbits/s
(behält jede Sekunde oder schneller Zugabe von neuen Linien)

Ich habe

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

ich versucht, mit fseek() mit einem "php tail script".

Beide resultierten in einem seltsamen Verhalten.

lief ich mein Skript von der Kommandozeile und es ausgegeben:

frame = XX fps = XX q = XX size = XX Zeit = XX Bitrate = XXkbits/s

Wo XX nahm für einige Sekunden zu, bis es der Wert aus der letzten Zeile war. Jetzt

, In meinem PHP-Skript, ich habe

echo "--$last_line--"; 

Wenn ich es laufen, ist der Ausgang für einige Sekunden, nur die Protokollzeile mit steigenden Zahlen. Wenn, wenn das Ende erreicht hat, wird der Ausgang

--ame = 7119 fps = 9 q = 13.8 size = 4809kB Zeit = 474,50 Bitrate = 83.0kbits/s

anzumerken, dass die erste " - "kollidierte mit der $ last_line und der anderen" - "ist nicht da.

Was ist die Erklärung für dieses seltsame Verhalten?


+0

Versucht mit Echo "-". $ Linie. "- \ n"; auch –

Antwort

3

Dies ist wahrscheinlich, weil es Sie denkt fragst es „$ lastline--“ ...

Versuchen

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

Sie könnte auch so etwas wie

tun drucken möchten
var_dump($lastline); die(); 

Um Ihnen genau zu zeigen, was in der Variable ist, wie dies Ihnen mehr Informationen geben wird.

Ich schlage jedoch vor, dass Sie Ihr ganzes Skript posten, damit jemand versuchen kann zu sehen, was das Problem ist.

BEARBEITEN Wenn Sie die Datei betrachten, scheint sie ONLY \ r als Zeilenabschluss zu verwenden. Dies verursacht die Probleme, die Sie sehen (es bedeutet "Rückkehr zum Anfang der Zeile") - das bedeutet, dass das gesamte Protokoll als letzte Zeile angezeigt wird.

Try er

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

Befehl mit der letzten Zeile des Protokolls zu erhalten.

+0

Das hat nicht funktioniert. Wie Sie vorgeschlagen haben, habe ich var_dump hinzugefügt, aber es tut auch das Gleiche. Sehen Sie den Video-Screenshot, den ich hinzugefügt habe. –

+0

Vielen Dank, der neue Befehl hat perfekt funktioniert. Ich dachte nicht, dass das kalt ist. Etwas Neues lernen. –

0

Sowohl der Tail-Befehl als auch das PHP-Skript haben das gleiche Problem. Sie suchen bis zum Ende der Datei, bis zum vorherigen Zeilenende, dann lesen und drucken Sie alles von dort bis zum Ende der Datei.

Das ist in Ordnung, wenn die Datei nicht sehr schnell wächst. Wenn die Datei schnell wächst, werden mehrere Zeilen zurückgegeben.

entweder von diesen Versuchen:

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

Die erste etwas genauer, aber der zweite ist schneller.

+0

Danke, aber das hat nicht geholfen. Ich werde versuchen, Screenshots zu machen. –