Shell rotatelog

lawrenz23 Messages postés 40 Statut Membre -  
 Utilisateur anonyme -
Bonjour,
je suis un débutant en Shell et je souhaite avoir votre aide pour un projet sur la rotation de log.

je souhaite crée un script en shell qui me permettra de faire ceci :
Pouvez-vous m'aider ?

access.log.5.gz => suppression
access.log.4.gz => access.log.5.gz
access.log.3.gz => access.log.4.gz
access.log.2.gz => access.log.3.gz
access.log.1 => access.log.2.gz
access.log => access.log.

5 réponses

  1. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
     
    Salut,

    C'est pour ton apprentissage ? Parce que sinon, il existe déjà un programme tout en un qui fait ça : logrotate ;-)
    0
  2. lawrenz23 Messages postés 40 Statut Membre 6
     
    Salut,

    C'est pour mon apprentissage je souhaite scripter.
    Pourrai-tu m'aider ?
    0
    1. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
       
      Dans ce cas montres-nous ce que tu as déjà fait ou comment tu comptes t'y prendre et on t'aidera...
      0
  3. lawrenz23 Messages postés 40 Statut Membre 6
     
    j'ai fait ceci mais je crois que c'est complètment à côté de la plaque:
    (je me suis aider d'internet pour faire ceci )

    date=$(date '+%Y.%m.%d-%H:%M:%S')
    for i in 'find /var/log/messages ';do
    num='/usr/sbin/fuser -u ${i} 2>/dev/null | awk '{print $1}' | wc -l'
    if [ ${num} -gt 0 ]
    then
    echo "-----COPYING, GZIP'ing and MOVING open file ${i} to ${i}.${date}-----"
    cp ${i} ${i}.${date} | gzip ${i}.${date} | mv $i.${date}.gz /var/log/archive
    echo "-----zero out ${i}-----"
    >${i}
    else
    echo "gzip'ing and moving ${i} to /var/log/messages"
    mv ${i} ${i}.${date}
    gzip ${i}.${date}
    mv ${i}.${date}*.gz /var/log/archive
    fi
    done
    0
    1. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
       
      Bon déjà, normalement /var/log/messages n'est pas un répertoire mais un fichier ;-\

      Admettons que ce soit un répertoire contenant des fichiers, que vient faire la date là-dedans, dans la mesure où dans ton exemple (et dans le cas des logs) il n'y a pas de date dans leur nom ? ;-\

      J'ai vu à quoi servait la date, mais ce n'est pas le but de ta demande ;-\
      0
  4. lawrenz23 Messages postés 40 Statut Membre 6
     
    Que me conseillerais-tu de faire s'il te plait ?
    0
    1. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
       
      Te tenir dans un premier temps à ta demande initiale.

      Ne pas sauter les étapes et y aller progressivement. Ton script mélange des histoires de dates, de compressions, de tests (fuser) et ça c'est le meilleur moyen de se perdre quand on débute.

      Procède étape par étape. Ne mélange pas tout.

      Essaie d'écrire un algorithme pour ce que tu penses devoir faire. Puis pose-le ici, des spécialistes devraient t'aider à l'affiner (pas moi malheureusement, je ne connais rien en algorithmie et je ne te serai pas d'un grand secours ;-( )

      Après en partant de là, on écrira les commandes qui devraient aboutir à ta demande (faire une rotation des logs).
      0
    2. lawrenz23 Messages postés 40 Statut Membre 6
       
      ok merci je vais essayer de faire un algo
      0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. lawrenz23 Messages postés 40 Statut Membre 6
     
    Salut,

    j'ai fait ceci :

    #!/bin/ksh
    logfilesizecurrent='wc -l /var/log/messages | awk '{print $1}''
    if [ "$logfilesizecurrent" -gt 2 ]
    then
    for i in 3 2 1; do
    cat /var/log/messages > /var/log/messages.$((i+1)) && gzip /var/log/messages.$((i+1))
    echo "" > /var/log/messages

    done

    else
    echo " pas de rotation "

    fi
    0
    1. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
       
      Pourquoi comptes-tu les lignes du fichier /var/log/messages ?
      De plus pas la peine d'utiliser "awk", wc -l < fichier renverra le résultat sans le nom dudit fichier.

      J'ai du mal à comprendre le "echo "" > /var/log/messages" ???
      Si tu vides ce fichier, à la seconde rotation 'cat /var/log/messages > /var/log/messages.$((i+1))' sera vide ;-(

      Pour vider un fichier pas besoin de la commande "echo", un simple :
      > fichier
      suffit.
      0
    2. lawrenz23 Messages postés 40 Statut Membre 6
       
      j'ai corriger les fautes mais à la base je voulais partir de la taille du fichier mais je sais pas comment faire ?
      0
    3. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
       
      stat est ton ami ;-)
      0
    4. lawrenz23 Messages postés 40 Statut Membre 6
       
      Merci j'ai trouvé j'ai une autre question quand il fait cette rotation il me stock les informations du fichier log de base dans le fichier.4 alors que le fichier.1 fichier.2 et fichier.3 sont vides.

      Es-ce que mon for est-il bon pour faire une rotation?
      0
    5. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
       
      Je t'avais pourtant prévenu [echo "" > /var/log/messa là] ;-((

      J'ai du mal à comprendre le "echo "" > /var/log/messages" ???
      Si tu vides ce fichier, à la seconde rotation 'cat /var/log/messages > /var/log/messages.$((i+1))' sera vide ;-(
      0