2009-08-06 6 views
1

J'essaie d'obtenir la dernière ligne d'un fichier. Le fichier, ff.log, reçoit de nouvelles données toutes les secondes pendant que ffmpeg fonctionne. Le fichier journal ressemble à ceci:Folie de fichier Linux - Comportement étrange d'obtenir la dernière ligne du fichier journal

frame = 20 fps = 0 q = 7,7 size = temps 40ko = 1,24 bitrate = 266.1kbits/s
frame = 30 images par seconde = 28 q = 6,6 size = temps 51kb = 1,90 bitrate = 218,4 kbits/s
cadre = 40 fps = 24 q = 6,6 taille = 61kB temps = 2.60 bitrate = 191.4kbits/s
cadre = 47 fps = 20 q = 6.8 taille = 65kB temps = 3.08 bitrate = 173.8kbits/s
frame = 64 images par seconde = 22 q = 7,0 size = 84ko temps = 4.20 bitrate = 163.8kbits/s
(continue d'ajouter de nouvelles lignes par seconde ou plus rapide)

J'ai essayé

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

J'ai essayé d'utiliser fseek() avec un "php tail script".

Les deux ont abouti à un comportement étrange.

Je courais le mon script de ligne de commande et émis en sortie:

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

Où XX a continué à augmenter pendant plusieurs secondes jusqu'à ce que ce soit la valeur de la dernière ligne.

Maintenant, dans mon script php, j'ai

echo "--$last_line--"; 

Quand je lance, la sortie est pendant quelques secondes, juste la ligne du journal avec un nombre croissant. Quand lorsqu'il atteint la fin, la sortie est

--ame = 7119 fps = 9 q = 13,8 size = temps 4809kB = 474,50 bitrate = 83.0kbits/s

Notez que le premier " - "est entré en collision avec le $ last_line et l'autre" - "n'est pas là.

Quelle est l'explication de ce comportement étrange?


+0

Essayé avec écho "-". $ Ligne. "- \ n"; aussi –

Répondre

3

Ceci est probablement parce qu'il pense que vous demandez à imprimer « $ lastline-- » ...

Essayez

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

vous pouvez également faire quelque chose comme

var_dump($lastline); die(); 

Pour vous montrer exactement ce qui est dans la variable, car cela vous donnera plus d'informations. Cependant, je vous suggère de poster tout votre script afin que quelqu'un puisse essayer de voir quel est le problème.

EDIT En regardant le fichier, il semble qu'il utilise UNIQUEMENT comme un terminateur de ligne. Cela provoque les problèmes que vous voyez (cela signifie "revenir au début de la ligne") - cela signifie que tout le journal est affiché comme la dernière ligne.

Essayez d'utiliser il commande

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

pour obtenir la dernière ligne du journal.

+0

Cela n'a pas fonctionné. Comme vous l'avez suggéré j'ai ajouté var_dump mais il fait aussi la même chose. Voir la capture d'écran vidéo que j'ai ajouté. –

+0

Merci beaucoup, la nouvelle commande a parfaitement fonctionné. Je ne pensais pas que le froid cause ça. Apprendre quelque chose de nouveau. –

0

La commande tail et le script PHP ont le même problème. Ils cherchent à la fin du fichier, sauvegarder jusqu'à la fin de ligne précédente, puis lire et imprimer tout de là à la fin du fichier.

C'est très bien si le fichier ne se développe pas très rapidement. Lorsque le fichier se développe rapidement, plusieurs lignes sont renvoyées.

Essayez l'une de ces:

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

Le premier est un peu plus précis, mais le second est plus rapide.

+0

Merci, mais cela n'a pas aidé. Je vais essayer de faire des captures d'écran. –

Questions connexes