Comment puis-je limiter la taille d'un fichier journal écrit >>
à 200 Mo?
$ run_program >> myprogram.log
io-redirection
limit
size
David
la source
la source
Réponses:
Si votre application (c.-à-d.
run_program
) Ne prend pas en charge la limitation de la taille du fichier journal, vous pouvez vérifier périodiquement la taille du fichier en boucle avec une application ou un script externe.Vous pouvez également utiliser
logrotate(8)
pour faire pivoter vos journaux, il a unsize
paramètre que vous pouvez utiliser pour votre objectif:la source
postscript
option pour que la configuration logrotate soit envoyéeSIGHUP
au programme.Si votre programme n'a pas besoin d'écrire d'autres fichiers qui seraient plus grands que cette limite, vous pouvez informer le noyau de cette limite en utilisant
ulimit
. Avant d'exécuter votre commande, exécutez ceci pour configurer une limite de taille de fichier de 200 Mo pour tous les processus exécutés dans votre session shell actuelle:Cela protégera votre système, mais cela pourrait être gênant pour le programme qui écrit le fichier. Comme le suggère eyazici , envisagez de configurer la
logrotate
taille des fichiers journaux une fois qu'ils atteignent une certaine taille ou un certain âge. Vous pouvez supprimer les anciennes données ou les archiver pendant une période de temps dans une série de fichiers compressés.la source
Vous pouvez créer une nouvelle image de système de fichiers, la monter à l'aide d'un périphérique de boucle et placer le fichier journal sur ce système de fichiers:
Vous pouvez également utiliser à la
tmpfs
place d'un fichier, si vous avez suffisamment de mémoire.la source
Vous pouvez tronquer la sortie avec
head
:la source
SIGPIPE
) une fois qu'il a atteint la taille limite, plutôt que de supprimer les données.dd
chose avec de la magie, mais oui, @ Random832 a raison, vous obtiendrez unSIGPIPE
ashead
/dd
/whatever
drops it.trap '' SIGPIPE
?{ head -c "$size" >> log; cat > /dev/null; }
.Dans le package
apache2-utils
est un utilitaire appelérotatelogs
, il peut être utile pour vous.Synopsis:
rotatelogs [-l] [-L linkname ] [-p program ] [-f] [-t] [-v] [-e] [-c] [-n nombre-de-fichiers ] logfile rotationtime | taille du fichier (B | K | M | G) [ décalage ]
Exemple:
Manuel complet que vous pouvez lire sur ce lien .
la source
Je suis certain que l'affiche originale a trouvé une solution. Voici un autre pour ceux qui peuvent lire ce fil ...
Curtail limite la taille de la sortie d'un programme et préserve les 200 derniers Mo de sortie avec la commande suivante:
Les références
REMARQUE: je suis le responsable du dépôt ci-dessus. Partageons simplement la solution ...
la source
Puisqu'il s'agit de texte, j'écrirais un script dans votre langue préférée et le dirigerais vers cela. Demandez-lui de gérer les E / S du fichier (ou conservez-les tous en mémoire, puis videz-le
SIGHUP
ou similaire). Pour cela, au lieu de 200 Mo, je pense à un nombre «raisonnable» de lignes à suivre.la source
syslog
etlogrotate
.Le script suivant devrait faire le travail.
Il a quelques raccourcis évidents, mais dans l'ensemble, il fait ce que vous avez demandé. Il divisera le journal en morceaux d'une taille limitée et la quantité de morceaux est également limitée. Tout peut être spécifié via les arguments de la ligne de commande. Le fichier journal est également spécifié via la ligne de commande.
Notez un petit problème si vous l'utilisez avec le démon qui passe en arrière-plan. L'utilisation d'un pipe empêchera le démon de passer en arrière-plan. Dans ce cas, il existe une syntaxe (probablement spécifique à bash) pour éviter le problème:
Notez
<&0
que, bien qu'apparemment redondant, cela ne fonctionnera pas sans cela.la source