IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Shell et commandes GNU Discussion :

Script pour copier des fichiers de log lorsque la taille est atteinte


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Octobre 2005
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 38
    Par défaut Script pour copier des fichiers de log lorsque la taille est atteinte
    Bonjour,

    J'ai créé un script me permettant de copier un fichier de log syslog dont la taille s'incrémente vers un disque dur lorsque la taille du fichier atteint par exemple 50Mo.
    la particularité est lorsque le fichier est copié, je fais une remise à zéro du fichier initial.
    La taille va donc s'incrémenter à nouveau et lorsqu'elle atteindra une nouvelle fois 50Mo, je copie le fichier à nouveau. Etc.... etc.... je répète la boucle indéfiniment.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    #!/bin/bash
    while true
    do
    		find . -type f -name syslog_message -size +50000c -print
    		cp -f /mnt/sda1/syslog_message "/mnt/sda1/save_log/log-$(date +"%Y%m%d-%H:%M:%S")"
    		truncate messages -s 0
                    echo log-$(date +"%Y%m%d-%H:%M:%S")
    done
    Le script ci-dessous fonctionne partiellement, je n'arrive pas à inclure dans la CONDITION de la boucle while la vérification de la taille du fichier.
    Par contre, en exécutant les commandes les unes après les autres, cela fonctionne parfaitement.

    J'essaie juste d'intégrer cela dans un script automatique.

    Comportement actuel:
    a chaque loop, le fichier est copié et est remise a zero.
    Cependant comme la boucle dur moins d'une seconde, en gros le script copie le fichier log qui fait tout le temps 0 octets.

    Auriez-vous une petite idée svp?

  2. #2
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 651
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 651
    Par défaut
    Bonjour,

    ici, find ne sert à rien, puisque tu sais où se trouve le fichier (/mnt/sda1/syslog_message)
    je ne suis pas convaincu par la commande truncate, dont la syntaxe est truncate OPTION FICHIER. Or, messages n'est ni une option, ni le fichier dont tu veux réduire la taille à zéro.
    d'ailleurs, cette commande est aussi inutile, parce que pour écraser un fichier il suffit d'un > "$nomFichier".

    la commande pour obtenir la taille d'un fichier en octets (à toi de calculer 50M en octets ) est stat -c '%s' "$nomFichier".

    enfin
    as-tu vraiment besoin que le script boucle toutes les secondes ? c'est beaucoup.
    toutes les minutes, ça n'irait pas ? ça permettrait de déléguer la boucle à cron...
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #3
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 287
    Par défaut
    Bonjour

    TRUNCATE(1)                                                                                                                                    Commandes de l'utilisateur                                                                                                                                   TRUNCATE(1)
    
    NOM
           truncate - Réduire ou étendre la taille d'un fichier à la taille indiquée
    
    SYNOPSIS
           truncate OPTION ... FICHIER ...
    
    DESCRIPTION
           Réduire ou étendre la taille de chaque fichier à la taille indiquée
    
           Un paramètre FICHIER qui n'existe pas sera créé.
    
           Si un FICHIER est plus gros que la taille indiquée, les données supplémentaires seront perdues.
    Tu veux vraiment que les traces soient perdues ?

  4. #4
    Membre averti
    Inscrit en
    Octobre 2005
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 38
    Par défaut
    Hello,

    Merci pour vos feedback.

    j'ai finalement fait deux boucles. Ca a l'air fonctionnel. la fonction FIND me permet de tester la taile du fichier syslog_message.
    Pour le truncate, la commande est correcte. Je me suis juste trompé dans le nom du fichier. syslog_message au lieu de messages.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
     
    #!/bin/bash
     
    while :
     
    do
     
    find . -type f -name messages -size +50000c -print |while read messages;
     
    	do
    		cp -f /mnt/sda1/syslog_message "/mnt/sda1/log-$(date +"%Y%m%d-%H:%M:%S")"
    		truncate syslog_message -s 0
     
            echo log-$(date +"%Y%m%d-%H:%M:%S");
     
    	done
     
    done
    Ce n'est pas forcément très propre mais pour un test ponctuel de 2 a 3 jours, cela est suffisant.

    Du coup, boucle infinie à l'intérieur de laquelle je vais vérifier avec la commande FIND a taille du fichier syslog_message. Lorsqu'elle sera supérieure à 50Mo, je copie ensuite le fichier dans un autre répertoire en l'incrémentant à l'aide de la date et de l'heure. Le fichier syslog_message est ensuite réinitailisé à zero.

    Pour info les logs se situent dans un système embarqué qui ne reconnait 50Mo en "50000c" C'est la raison pour laquelle la commande est tapée de cette manière.

  5. #5
    Responsable Systèmes


    Homme Profil pro
    Gestion de parcs informatique
    Inscrit en
    Août 2011
    Messages
    18 256
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Gestion de parcs informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2011
    Messages : 18 256
    Par défaut
    Pourquoi ne pas utiliser logrotate ?

    Que tu pourrais éventuellement complété avec un rsync vers disque de sauvegarde ou une variante selon la rétention que tu souhaites.
    Ma page sur developpez.com : http://chrtophe.developpez.com/ (avec mes articles)
    Mon article sur le P2V, mon article sur le cloud
    Consultez nos FAQ : Windows, Linux, Virtualisation

  6. #6
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 651
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 651
    Par défaut
    Ce n'est pas forcément très propre
    c'est surtout très inutile !

    tu n'as pas lu mon message ?!
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

Discussions similaires

  1. Script batch pour copier des fichiers
    Par LOBO1986 dans le forum Scripts/Batch
    Réponses: 2
    Dernier message: 21/01/2011, 15h34
  2. Script pour copier des fichiers.
    Par agilec dans le forum Linux
    Réponses: 3
    Dernier message: 15/10/2009, 18h43
  3. Réponses: 3
    Dernier message: 30/11/2006, 11h38
  4. Utiliser mon tableau pour copier des fichiers
    Par Paloma dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 31/10/2006, 18h38
  5. Batch pour copier des fichier
    Par borgfabr dans le forum Scripts/Batch
    Réponses: 3
    Dernier message: 09/03/2004, 07h55

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo