web-dev-qa-db-fra.com

Comment compresser, conserver et vider le fichier original avec gzip

Pour une raison quelconque, je ne peux pas utiliser logotate pour compresser les fichiers périodiquement.
J'ai donc décidé d'écrire mon propre script. Ce n'est pas la chose la plus difficile, mais un petit détail m'implique.
Lorsque vous utilisez Zip pour compresser le fichier, logrotate conserve les fichiers d'origine et les vide. Je peux utiliser gzip then écho pour obtenir le même résultat, mais si mon application écrit beaucoup de données dans les journaux, il y aura certainement des journaux perdus dans les horodatages après l'exécution de gzip et avant echo.

gzip -k file.log
echo "" > file.log

Une idée, comment puis-je le faire? Me manque-t-il une option de gzip qui vide le fichier d'origine? Merci :)

Éditer

Résolu en envoyant un signal au processus (qui est un script de noeud) et en le forçant à rouvrir le fichier journal comme suggéré par AlexP.

2
storm

logrotate fonctionne en (1) renommant le fichier journal comme si vous utilisiez mv, (2) en créant un nouveau fichier portant l'ancien nom, (3) en signalant d'une manière ou d'une autre le ou les processus écrivant dans le journal. fichier à fermer et à rouvrir (cela les bascule vers le nouveau fichier), et enfin (4) compresser le fichier renommé.

L'étape la plus délicate est bien sûr (3), car la façon de dire à un processus qu'il doit fermer et rouvrir son ou ses journaux dépend du processus spécifique. Par exemple, si vous regardez dans /etc/logrotate.d/Apache2, il utilise la commande reload pour que Apache HTTP Server ferme et rouvre les journaux, tandis que /etc/logrotate.d/samba indique que, pour Samba, il envoie le signal SIGHUP.

1
AlexP

Voici comment vous pouvez le faire, ouvrez un terminal et tapez:

cat file.log | gzip -9 > tmp_file.gz && echo > file.log
1
adnane hosni