Forum Programmation.shell Problème find avec ctime

Posté par  . Licence CC By‑SA.
Étiquettes : aucune
0
30
oct.
2014

Bonjour,

J'ai petit soucis avec find et ctime, je vous explique.

2 dumps d'une base postgres sont exécutés tous les jours, un a 2h00 du matin l'autre a midi.
y'a un bout de script simple qui vérifie que le dump s'est déroulé correctement et si c'est le cas efface le fichier de dump le plus ancien avant de placer le nouveau dans le bon répertoire

FILE=db_test.`date +\%d.\%m.\%Y`.dump 

pg_dump --file=$2 --format=c --compress=$PGCOMPRESSIONLEVEL --schema=test --schema=public $1 

if [ $? = 0 ] 
then 
find /var/backups/dump -type f -ctime 0.65 -exec rm -f {} \; 
mv /var/backups/dump_tmp/$FILE /var/backups/dump 
else 
mv /var/backups/dump_tmp/$FILE /var/backups/dump/$FILE.ERROR 

fi 
exit 0

le problème que je rencontre est que quand le script de dump de 2h00 s'exécute, il conserve bien le dump généré à midi la veille et efface celui de 2h00 de la veille, je me retrouve avec 2 dumps…celui de midi de la veille et celui qui vient d'être générer…c'est ce que je veux.

mais quand celui de midi s'exécute il efface les 2, je voudrais qu'il ne m'efface que celui de midi de la veille et conserver celui de 2h00.
Je me retrouve qu'avec celui qui vient d'être générer…j'ai essayer pas mal de d'ajustement de ctime avec toujours le même résultat.

J'espère que c'est assez claire pour avoir un petit coup main car là je m'arrache les cheveux.

Merci à vous.

  • # Problème find avec ctime

    Posté par  . Évalué à 1. Dernière modification le 02 novembre 2014 à 18:19.

    bonjour,

    tu mets
    -ctime 0.65
    d’après man find, pour sélectionner tout ce qui est plus ancien que la valeur indiqué tu devrais mettre:
    -ctime +0.65

    A noter que chez moi je dois mettre 0,65 (virgule) mes locale étant en fr:

    locale
    LANG=fr_FR.UTF-8
    LANGUAGE=fr_FR
    LC_CTYPE="fr_FR.UTF-8"
    LC_NUMERIC="fr_FR.UTF-8"
    LC_TIME="fr_FR.UTF-8"
    LC_COLLATE="fr_FR.UTF-8"
    LC_MONETARY="fr_FR.UTF-8"
    LC_MESSAGES="fr_FR.UTF-8"
    LC_PAPER="fr_FR.UTF-8"
    LC_NAME="fr_FR.UTF-8"
    LC_ADDRESS="fr_FR.UTF-8"
    LC_TELEPHONE="fr_FR.UTF-8"
    LC_MEASUREMENT="fr_FR.UTF-8"
    LC_IDENTIFICATION="fr_FR.UTF-8"

    Ensuite 0,65*24=15,6 soit 15h
    je sais pas trop comment find réagit avec les nombres a virgules et les arrondis qu'il réalise. Pourquoi ne pas utilisé -cmin qui semble fait pour ton cas.

    -cmin +960

    Est ce que ça t'aide ?

    • [^] # Re: Problème find avec ctime

      Posté par  . Évalué à 2. Dernière modification le 02 novembre 2014 à 18:28.

      outre la piste evoquée ci-dessus, pourquoi ne pas simplement jouer du ctime X (X etant le nombre de fois 24h)
      dans ton cas tu prend des virgules donc des portions de 24h.

      avec un backup à 2h du mat, le suivant à 12h, le suivant à 2h le lendemain,
      suffit de lui demander d'effacer le --ctime +1 pour qu'à midi il efface celui de la veille, et à 2h du matin celui de 24h avant.

      sinon pour tes fichiers, penses à utiliser la notation inversée Année-mois-jour.
      Pourquoi ?

      parce que sinon tu vas avoir tous les fichiers du 20 du mois, puis tous les fichiers du 21 de chaque mois
      et quand tu feras un ls -l dans le dossier tu verras :

      fichier-20-09-2014.dump
      fichier-20-10-2014.dump
      fichier-21-09-2014.dump
      fichier-21-10-2014.dump
      ...

      avec la notation inversée, tu auras 'naturellement' la presentation suivante :

      fichier-2014-09-20.dump
      fichier-2014-09-21.dump
      fichier-2014-09-22.dump
      ...
      fichier-2014-10-01.dump
      fichier-2014-10-02.dump

      evidemment dans le cas present, vu que tu ne gardes que le dernier fichier, cela a peu d'importance, mais si tu en gardes plus, c'est bien de prendre de bonnes habitudes.

      • [^] # Re: Problème find avec ctime

        Posté par  . Évalué à 1.

        Bonjour,

        Merci tout d'abord pour vos réponses et le petit conseil qui va avec.
        Malheureusement je n'ai toujours pas résolu mon pb et je vous avoue que le comportement est vraiment curieux ou y'a un truc qui m'échappe.

        toujours le même pb.
        Je me suis dit ok je vais me baser sur "atime", pour tester j'ai créer 2 fichiers avec touch.

        XXX:/var/backups/aurion/dump#touch -at 11030200 test-2H
        XXX:/var/backups/aurion/dump# stat test-2H
        File: `test-2H'
        Size: 0 Blocks: 0 IO Block: 4096 regular empty file
        Device: ca11h/51729d Inode: 1056770 Links: 1
        Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
        Access: 2014-11-03 02:00:00.000000000 +0100
        Modify: 2014-11-03 13:44:08.000000000 +0100
        Change: 2014-11-03 13:44:08.000000000 +0100

        XXX:/var/backups/aurion/dump#touch -at 11021200 test-12H
        XXX:/var/backups/aurion/dump# stat test-12H
        File: `test-12H'
        Size: 0 Blocks: 0 IO Block: 4096 regular empty file
        Device: ca11h/51729d Inode: 1056771 Links: 1
        Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
        Access: 2014-11-02 12:00:00.000000000 +0100
        Modify: 2014-11-03 13:46:24.000000000 +0100
        Change: 2014-11-03 13:46:24.000000000 +0100
        Birth: -

        Quand je test manuellement ma commande "find", il trouve bien que le fichier test-12H

        XXX:~# find /var/backups/aurion/dump -type f -atime 0.65
        /var/backups/aurion/dump/test-12H

        mais quand il est exécuté dans le script , il m'efface tout !!!

        je vous remet le bout de script, y'a pas plus simple en plus….comprends pas !!

        if [ $? = 0 ]
        then
        find /var/backups/aurion/dump -type f -atime 0.65 -exec rm -f {} \;
        mv /var/backups/aurion/dump_tmp/$FILE /var/backups/aurion/dump
        else
        mv /var/backups/aurion/dump_tmp/$FILE /var/backups/aurion/dump/$FILE.ERROR

        Je suis sous Debian Wheezy.

        Merci./
        ```

  • # c'est compliqué

    Posté par  . Évalué à 2.

    Si l'idée est de garder les deux précédents, je ferai autrement

    if [ $? = 0 ]
    then
     read garde1 garde2 supression <<< $( ls -t /var/backups/dump )
     \rm $supression 
     mv ...
    else
    ...
    fi

    ps : je ne fais que du bash, si ça ne passe pas en dash/sh/ksh/tcsh/zsh, je décline toute responsabilité ;)
    pps : ça ne passe pas en dash
    ppps : ça peut se régler à coup de ls -t | ( read … )
    pppps : il y a surement plus élégant ;)

    Il ne faut pas décorner les boeufs avant d'avoir semé le vent

    • [^] # Re: c'est compliqué

      Posté par  . Évalué à 1.

      Bonjour,
      Merci d'avoir pris le temps de répondre mais ce n'est pas tout à fait ce que je cherche à faire.
      je cherche a supprimer le plus ancien et a conserver l'intermediaire.

      pour résumé

      un dump se lance tous les jours à:
      2h00 (du mat')
      12h00 (midi)
      2h00
      12h00
      2h00
      12h00
      ..etc

      je cherche a faire une rotation, quand celui de 2h00 est terminée, il efface celui de 2h00 la veille en gardant celui de 12h00 et la même pour celui de 12h00.

      Vous trouverez plus de détails sur l'étrange fonctionnement que je rencontre dans mes précédents posts.

      Merci a vous./
      ```

      • [^] # Re: c'est compliqué

        Posté par  . Évalué à 2.

        rien de très sorcier à adapter ;)

        if [ $? = 0 ]
        then 
          mv /var/backups/dump_tmp/$FILE /var/backups/dump 
          for i in 2H 12H 
          do 
            read garde1 supression <<< $( ls -t /var/backups/dump/*-${i}* )
            \rm $supression 
          done
        else
           mv /var/backups/dump_tmp/$FILE /var/backups/dump/$FILE.ERROR 
        fi

        Il ne faut pas décorner les boeufs avant d'avoir semé le vent

  • # Pas compliqué ...en effet !!

    Posté par  . Évalué à 1.

    Oui en effet :) Merci a toi.

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.