ces derniers jours, je reçois un courrier quotidien de la tâche logrotate de cron:
/etc/cron.daily/logrotate:
gzip: stdin: la taille du fichier a changé lors du zippage
Comment puis-je le réparer?
Merci, Gian Marco.
Voici n article de blog en français qui donne une solution.
En anglais, vous pouvez lire ce rapport de bogue .
Pour résumer:
Vous devez d'abord ajouter le --verbose
option dans le script /etc/cron.daily/logrotate
pour obtenir plus d'informations lors de sa prochaine exécution afin d'identifier le journal de rotation à l'origine du problème.
#!/bin/sh
test -x /usr/sbin/logrotate || exit 0
/usr/sbin/logrotate --verbose /etc/logrotate.conf`
Ensuite, vous devez ajouter l'option delaycompress
dans la configuration logrotate.
Comme exemple, j'ajoute la configuration logrotate du nginx dans /etc/logrotate.d/nginx:
/var/log/nginx/*.log {
daily
missingok
rotate 14
compress
delaycompress
notifempty
create 0640 www-data adm
sharedscripts
...
}
upstart
fermera (et rouvrira) son fichier journal quand il remarque que le fichier est supprimé . Cependant, si vous regardez ce que fait gzip , vous voyez qu'il ne supprime pas le fichier tant qu'il n'est pas en train d'écrire le fichier de sortie. Cela signifie qu'il existe toujours une condition de concurrence critique où des lignes de journal peuvent être perdues pour les journaux de lignes en cours d'écriture gzipping
.
Vous pouvez désactiver l'avertissement à l'aide de gzip --quiet
, mais cela ne cache pas le fait que vous pourriez encore perdre des lignes de journal.
Cela signifie que delaycompress
n'est pas un correctif générique à cela. C'est une solution spécifique à un problème spécifique.
La vraie solution est probablement une combinaison de delaycompress
et de pouvoir envoyer un signal au processus. Cela fera disparaître la condition de course dans la pratique (sauf si vous tournez plusieurs fois par seconde :)).