12
votes

Pourquoi ne fonctionne pas "queue" de tronquer des fichiers journaux?

J'essaie de gérer ma taille de fichier journal à l'aide d'un script cron. Je veux fondamentalement supprimer toutes les 2 000 dernières lignes du fichier journal tous les soirs. J'essaie d'exécuter cette commande, mais il semble de vider tout le dossier au lieu de faire ce que je veux:

queue -2000 logfile.txt> logfile.txt

Est-ce que quelqu'un sait pourquoi cela ne fonctionne pas et / ou comment accomplir ce que je veux? Merci!


0 commentaires

6 Réponses :


15
votes

Vous écrasez le fichier avant queue commence même à le lire. Le shell traite l'opérateur > rediriger, en supprimant d'abord le fichier. Ensuite, il exécute queue qui n'a pas de données à lire.

Vous pouvez résoudre ceci en utilisant un fichier temporaire: xxx


3 commentaires

> logfile.txt - signifie créer un nouveau fichier


oui, mais si le nom de fichier est identique à la saisie, il l'écraserait


Cela ne fonctionne que si le processus écrit sur le fichier journalier ferme son descripteur de fichier. Typique, mais pas toujours vraie.



1
votes

Greg Hewgill a raison, logfile.txt est tronqué avant la queue peut fonctionner dessus.

Essayez: p>

tail -2000 logfile.txt > logfile2.txt; rm -f logfile.txt; mv logfile2.txt logfile.txt


4 commentaires

Dans ce cas, rm est inutile car mv va gérer le fichier de destination pendant le renommant.


Droite ... j'étais juste redondant: p


Cela ne fonctionne que si le processus écrit sur le fichier journalier ferme son descripteur de fichier. Typique, mais pas toujours vraie.


Ce n'est pas correct, NVRAM. Cela fonctionne même si le processus ne ferme pas sa FD. Il tronque le fichier sans erreur. Mais le processus de journalisation peut ne pas prendre conscience de la substitution du fichier et de la journalisation peut cesser de fonctionner jusqu'à ce que le fichier [nouveau] soit rouvert.



10
votes

Plutôt que de le faire avec votre propre fichier cron, vous pouvez envisager d'utiliser logrotate pour une solution plus robuste. Vous pouvez faire pivoter les journaux, contrôler combien de temps pour les garder autour, les envoyer par courrier électronique, comprimer les vieux journaux et exécuter des scripts après que vous le souhaitez.

Voir la page man ici Ou tapez homme logrotate à partir de la ligne de commande

Créer un nouveau fichier de logrotate dans votre /etc/logrotate.d//d/. Voici un exemple: xxx


0 commentaires

11
votes

Il y a un problème avec la solution acceptée si le processus maintient le fichier journal ouvert em>; Vous devez essentiellement réutiliser le nœud I. La réponse des Mmrobins est bonne, logrotate em> devrait faire la bonne chose.

utiliser queue forte>, vous pouvez faire quelque chose (semblable à la notice de Pantonza's & Greg), mais conserver la fichier original en tronquant le fichier d'origine en place: p> xxx pré>

Pour éviter un fichier Temp, vous pouvez lire dans une variable, puis le reculer: P>

bash -c 'X=$(tail -2000 logfile.txt);echo "$X">logfile.txt'


0 commentaires

5
votes

Voici une autre solution, sans traiter des fichiers TMP: xxx


2 commentaires

J'ai eu le problème que j'essayais de tronquer un fichier avec un descripteur de fichier ouvert. Donc, un fichier TMP n'était pas une option. Merci!


Yo! C'est fantastique. Vous devriez ajouter un certain contexte sur la raison pour laquelle cela fonctionne. Je suppose que c'est parce que les backtsks sont traités d'abord quelles sont "stockes" les 2000 lignes de la commande, qui se résonnèrent ensuite et remplace le logfile.txt . Semblable à utiliser une variable mais beaucoup plus simple. Soigné!



1
votes

Si vous êtes un utilisateur VIM, une autre option est d'utiliser VI code> au lieu de queue code>, pour fonctionner directement sur le fichier:

vi "+execute \"normal! G2000kO\<esc>dgg\"" "+w" "+q" logfile.txt


0 commentaires