J'ai un grand ./program
nombre de messages de journalisation ainsi qu'un espace de stockage très limité sur mon VPS:
Je voudrais que mon fichier journal ne contienne que les dernières N lignes tout le temps (ou plutôt quand je termine ^Cmon programme ou quand il se bloque ... )
A. Je ne veux pas ce qui suit:
"Redirige la sortie dans un fichier (journal), puis utilise
tail
pour ne conserver que les N dernières lignes."Eh bien, le fichier journal prendrait toujours un espace précieux jusqu'à ce que je fonctionne
tail
, ce qui le rend inutile. Je peux configurer un cronjob pour le faire périodiquement si je n'ai pas d'autre choix, mais j'aimerais explorer les possibilités premier."Utilisez
logrotate
."logrotate
semble être la solution appropriée au problème, mais c’est trop compliqué et je veux quelque chose de plus simple, de préférence quelque chose que je peux faire avec des pipes et des redirections.
B. J'ai essayé ce qui suit:
(remplacé ./program
par seq 1000000
si pour tester)
seq 1000000 | tee /dev/fd/2 | tail -n 10 > logfile
Fonctionne parfaitement bien quand il se termine tout seul, mais quand je l’interromps ^Cmoi-même, le
logfile
est vide (alors que je pense qu’il contiendra les 10 dernières lignes imprimées à l’écran partee
)mkfifo fifo; tail fifo -n 10 > logfile & seq 1000000 | tee fifo
Fonctionne parfaitement bien quand il se termine tout seul, mais quand je l’interromps ^Cmoi-même, le
logfile
n'est pas vide, mais ne contient pas non plus un peu des dernières entrées du journal qui sont imprimées à l’écran:
.
$ tail fifo -n 10 > logfile & seq 1000000 | tee fifo
[1] 2616
1
2
3
⋮
480178
480179
480180
480181
480182
480183
^C
[1]+ Done tail fifo -n 10 > logfile
$ cat logfile
479297
479298
479299
479300
479301
479302
479303
479304
479305
Ici, vous pouvez voir que les dernières entrées sont à 480 milliers, alors que la dernière entrée dans le logfile
est de 479 305 ... ce qui signifie que je manque 878 dernières lignes! Je pense que cela a quelque chose à voir avec la mise en mémoire tampon, mais je ne suis pas sûr.
Quelqu'un peut-il me montrer comment faire cela en utilisant uniquement des utilitaires shell et (de préférence standard) Linux? Merci!
Réponses:
La solution la plus simple pour votre cas est probablement le journal circulaire, de taille fixe.
Si vous êtes sur Linux, vous pouvez essayer le module du noyau
emlog
Sur les systèmes BSD, voir
CLOG(8)
la source