web-dev-qa-db-fra.com

Comment puis-je corriger «/etc/cron.daily/logrotate: gzip: stdin: la taille du fichier a été modifiée lors du zippage»?

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.

19
Kiuki

Voici n article de blog en français qui donne une solution.

En anglais, vous pouvez lire ce rapport de bogue .

Pour résumer:

  1. 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`
    
  2. 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
        ...
    }
    
23
lamanux

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 :)).

1
Ztyx