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: p>
queue -2000 logfile.txt> logfile.txt p>
Est-ce que quelqu'un sait pourquoi cela ne fonctionne pas et / ou comment accomplir ce que je veux? Merci! P>
6 Réponses :
Vous écrasez le fichier avant Vous pouvez résoudre ceci en utilisant un fichier temporaire: p> queue code> commence même à le lire. Le shell traite l'opérateur > code> rediriger, en supprimant d'abord le fichier. Ensuite, il exécute queue code> qui n'a pas de données à lire.
> logfile.txt code> - 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.
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
Dans ce cas, rm code> est inutile car mv code> 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.
Plutôt que de le faire avec votre propre fichier cron, vous pouvez envisager d'utiliser Voir la page man ici
Ou tapez Créer un nouveau fichier de logrotate dans votre /etc/logrotate.d//d/. Voici un exemple: p> logrotate code> 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. homme logrotate code> à partir de la ligne de commande p>
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 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'
Voici une autre solution, sans traiter des fichiers TMP:
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 code>. Semblable à utiliser une variable mais beaucoup plus simple. Soigné!
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