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 :

[bash] : tester l'intégrité des fichiers avant de les traiter


Sujet :

Shell et commandes GNU

  1. #1
    Membre averti
    Homme Profil pro
    [SciComp]
    Inscrit en
    Août 2013
    Messages
    134
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : [SciComp]

    Informations forums :
    Inscription : Août 2013
    Messages : 134
    Points : 323
    Points
    323
    Par défaut [bash] : tester l'intégrité des fichiers avant de les traiter
    Bonjour,

    Je suis en train de vérifier un script qui boucle infiniment sur les actions suivantes:
    1 - teste l'existence de fichier(s) dans un répertoire
    2 - si des fichiers existent, lance en background une application de traitement pour chaque fichier (avec au max N fichiers qui sont traités en parallèle avec un ordonnancement de type "file d'attente" - chaque appli efface (mv vers un tmpdir) le fichier du répertoire source)
    3 - une fois que la liste est parcourue et qu'un emplacement est libre dans la file d'attente, boucle sur (1)

    Je pense être à deux doigts d'avoir une solution viable.
    Sauf que, lorsque le répertoire est vide, mais qu'on est en train de le remplir, et que la liste des fichiers est actualisée alors que des fichiers sont en train d'être copiés depuis un poste distant (donc potentiellement lent via réseau), comment m'assurer que le délai est suffisamment long pour que les fichiers soient intègres avant de les traiter ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    while :; do
       filelist=( ${input_dir}/* )
       if [ ${#filelist[@]} -gt 0 ]; then
          for file in ${filelist[*]}; do
             if [ -f $file ]; then             # teste si par hasard ce n'est pas un répertoire 
                # est-ce suffisant pour tester l'intégrité du fichier - par exemple si la copie est encore en cours ???
                echo $file
                bash <appli> -d ${output_dir} ${file} &
                ... trucs pour gérer la queue ... 
             fi  
          done
       fi  
       sleep 1
    done
    Merci par avance de votre aide.
    xflr6

  2. #2
    Membre habitué
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Juillet 2014
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2014
    Messages : 84
    Points : 197
    Points
    197
    Par défaut
    je pense qu'il faut d'abord vérifier si le fichier est disponible, cad s'il n'est pas ouvert par un autre processus.
    D'après google, tu peux utiliser la commande
    trouvé ici : http://forums.fedora-fr.org/viewtopic.php?id=23091

    Une autre solution est la commande lsof, vue dans la même page
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    lsof | grep nomdufichier
    Une solution maison déjà utilisée est d'utiliser un fichier flag, de taille nulle, qui indiquerait la fin de la copie.
    Par exemple, le processus qui envoie les fichiers copie d'abord le fichier 20151119_Exemple1.cft puis créé, via la commande touch, le fichier flag nommé 20151119_Exemple1.cft.flag

  3. #3
    Membre averti
    Homme Profil pro
    [SciComp]
    Inscrit en
    Août 2013
    Messages
    134
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : [SciComp]

    Informations forums :
    Inscription : Août 2013
    Messages : 134
    Points : 323
    Points
    323
    Par défaut
    Merci, votre contribution m'a mis sur la piste de lsof, et la solution implémentée prend la forme suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ok=$(lsof $file | wc -l)
    if [[ $ok -eq 0 ]]; then
       ...
    fi
    Cordialement,
    xflr6

    PS : Parti sur cette solution, je précise que je n'ai toujours pas eu l'occasion de déployer la bête sur machine distante avec des fichiers volumineux transitant par réseau. En conséquence, il est toujours possible que cette solution en réponde pas à mes attentes.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [BASH] boucle for sur des fichiers, recuperation du chemin ?
    Par zevince dans le forum Shell et commandes GNU
    Réponses: 13
    Dernier message: 13/11/2007, 10h47
  2. Tester l'existence des fichiers
    Par Filipegomes dans le forum C#
    Réponses: 11
    Dernier message: 16/10/2007, 10h07
  3. L'intégrité des fichiers de mon serveur web
    Par emiplegie dans le forum Sécurité
    Réponses: 5
    Dernier message: 23/01/2007, 14h38
  4. [Ergonomie] Valider des fichiers avant l'upload
    Par lr dans le forum Webdesign & Ergonomie
    Réponses: 6
    Dernier message: 01/12/2006, 11h47
  5. Tester la taille de fichier avant upload
    Par RobinNono dans le forum Général JavaScript
    Réponses: 13
    Dernier message: 27/06/2006, 17h38

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