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 :

Comment savoir si un fichier est fini d'être uploadé ?


Sujet :

Shell et commandes GNU

  1. #1
    Futur Membre du Club
    Développeur Web
    Inscrit en
    Avril 2011
    Messages
    6
    Détails du profil
    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2011
    Messages : 6
    Points : 9
    Points
    9
    Par défaut Comment savoir si un fichier est fini d'être uploadé ?
    Bonjour tout le monde,

    je suis entrain d'écrire un script bash et je rencontre un souci.

    J'ai besoin de déplacer des fichiers vidéos (donc assez volumineux) d'un dossier vers un autre. Ce script est exécuté par une tache cron régulièrement, toutes les heures ou toutes les 30 min.

    Jusque là pas de problème.

    Mais je voudrais savoir comment je peux vérifier si un fichier est fini d'être uploadé, pour ne pas le déplacer alors qu'il est incomplet.

    Quelqu'un aurait il une idée ?

    Merci d'avance.

  2. #2
    Rédacteur/Modérateur
    Avatar de Winnt
    Homme Profil pro
    budget et contrôle de gestion
    Inscrit en
    Décembre 2006
    Messages
    1 978
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France

    Informations professionnelles :
    Activité : budget et contrôle de gestion
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 978
    Points : 4 130
    Points
    4 130
    Par défaut
    Salut,

    Il y a une solution. Passer par incron.
    Cet utilitaire surveille un répertoire et lance un script en réponse à la création, suppression,... d'un fichier.

    Tu peux très simplement faire exécuter l'action à la création du fichier <mon_répertoire_a_créer>.

    Voici un exemple d'un script que j'ai fait pour sortir la somme md5 d'un fichier

    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
    #!/bin/bash
    ##############################
    #
    # script générant les hash md5
    # recoit en paramêtre => $1 : le répertoire / $2 :le nom du fichier
    #
    ###############################
    #
    # deplacement repertoire de création des md5
    cd $1
    # creation somme md5 seulement si ce n'est pas un fichier .md5'
    if [[ ${2#*.} != "md5" ]]
    	then
    		md5sum $2 > ${2%.*}".md5"
    fi
    voici la ligne que j'ai placé dans incrontab
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    /home/<user>/md5 IN_CLOSE_WRITE,IN_MOVED_TO /home/<user>/scripts/incron_md5.sh $@ $#
    $@ => nom du répertoire surveillé
    $# => nom du fichier déplacé (IN_MOVED_TO) ou créé (IN_CLOSE_WRITE)
    /home/<user>/md5 => répertoire à surveiller
    /home/<user>/scripts/incron_md5.sh => script à appeler pour exécuter une action

    Avantage de cette méthode c'est que tu peux utiliser le même répertoire pour des actions différentes.
    Par exemple :
    fichier.crea => création d'un répertoire
    fichier.supp => suppression d'un répertoire
    ....

    Il suffit d'intégrer quelques tests dans le script de surveillance et tu fais ce que tu veux.

    Apparemment, il semble que tu ne puisses avoir qu'un seul script par répertoire surveillé.

  3. #3
    Expert éminent sénior Avatar de frp31
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2006
    Messages
    5 196
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2006
    Messages : 5 196
    Points : 12 262
    Points
    12 262
    Par défaut
    tu peux aussi tout simplement regarder l'état d'utilisation du fichier car tant que le processus XXXX n'a pas fini de télécharger le fichier ce dernier est associé à l'utilisation du fichier et donc

    Te retourne alors le n° du processus qui tient ce fichier ouvert.
    Si aucun processus n'est associé au fichier c'est qu'il est terminé de télécharger que ce soit parce qu'il est au bout, ou que la liaison avec le site d'origine soit rompue.

    et Bien sur là tu n'as pas besoin de MD5SUM mais c'est quand même bien pratique et souvent pertinent* d'utiliser la méthode indiquée par Winnt.

    * enfin à chaque fois que tu traites un échange important de fichier soit en taille soit que ce soit des fichiers importants qui ne doivent jamais être transmis corrompus, etc....

  4. #4
    Rédacteur/Modérateur
    Avatar de Winnt
    Homme Profil pro
    budget et contrôle de gestion
    Inscrit en
    Décembre 2006
    Messages
    1 978
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France

    Informations professionnelles :
    Activité : budget et contrôle de gestion
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 978
    Points : 4 130
    Points
    4 130
    Par défaut
    Salut,

    @frp31
    Comme par exemple le téléchargement d'une iso afin de vérifier la somme md5

  5. #5
    Expert éminent sénior Avatar de frp31
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2006
    Messages
    5 196
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2006
    Messages : 5 196
    Points : 12 262
    Points
    12 262
    Par défaut
    tout à fait.


    Mais fuser permet de vérifier même un fichier dont on a pas le md5 ou dont on ignore la taille à l'avance.

  6. #6
    Rédacteur/Modérateur
    Avatar de Winnt
    Homme Profil pro
    budget et contrôle de gestion
    Inscrit en
    Décembre 2006
    Messages
    1 978
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France

    Informations professionnelles :
    Activité : budget et contrôle de gestion
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 978
    Points : 4 130
    Points
    4 130
    Par défaut
    Salut,

    Citation Envoyé par frp31
    Mais fuser permet de vérifier même un fichier dont on a pas le md5 ou dont on ignore la taille à l'avance.
    Sans nul doute.
    Toutefois, je préfère incron qui me semble moins complexe mais permet de gérer tout de même le déclenchement fin d'une action (sur accès, fermeture, création, suppression, modification, déplacement vers/de, ouverture).
    En bref, il suffit de bien penser son script en fonction de ce que l'on veut faire et on peut obtenir sans trop d'efforts (désolé d'être fainéant ) un résultat sympa.

    Par exemple, génération du md5 si le fichier est un .iso, déplacement des fichiers .jpg dans le répertoire image de home et copie dans le répertoire image de backup, etc... Et tout ceci avec une seule action de copie ou téléchargement d'un fichier (le plaisir d'être flemmard ).

  7. #7
    Futur Membre du Club
    Développeur Web
    Inscrit en
    Avril 2011
    Messages
    6
    Détails du profil
    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2011
    Messages : 6
    Points : 9
    Points
    9
    Par défaut
    Bonjour tout le monde.

    Merci pour vos réponses qui m'offrent de très bonnes pistes pour finir mon script.

    Je suis assez novice sur linux... et je ne connais pas encore tous les outils utiles.

    Je ne connaissais pas incron, mais je vais me pencher sur la question.

    Merci de votre aide.

  8. #8
    Expert éminent sénior Avatar de frp31
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2006
    Messages
    5 196
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2006
    Messages : 5 196
    Points : 12 262
    Points
    12 262
    Par défaut
    Citation Envoyé par Winnt Voir le message
    [...] (désolé d'être fainéant )[...]
    Un bon admin/ingé/exploitant système est par définition une féniasse, si tu arrives pas à glander au moins 1/2 journée par semaine c'est que tu fais mal ton boulot !! gnarf gniarg

  9. #9
    Membre du Club
    Profil pro
    ingénieur
    Inscrit en
    Septembre 2008
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur

    Informations forums :
    Inscription : Septembre 2008
    Messages : 54
    Points : 57
    Points
    57
    Par défaut
    Bonjour,

    j'ai eu la même problématique que toi, mais moi c'était avec un transfert FTP dont je ne savais pas trop quand ça se finissait, par conséquent j'ai donc fait un petit script qui permet de surveiller le remplissage du filesystem/répertoire dans lequel le fichier était uploadé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #!/usr/bin/bash
    dd if=/dev/zero of=lol bs=1024 count=102400  2> /dev/null &
    while true
      do
        sleep 1
         B=`df -k . | tail -1 | awk '{print $4}'`
          A=`ls -lrt lol | awk '{print $5}'`
            A=`echo "$A/1024" | bc`
          echo -e "\r\033[32m\033[31m$A Mo \033[32mont ete copies et il reste \033[31m$B Mo \033[32mde libre\033[0m \c"
        ps -ef | grep "dd " | grep -v grep 1>/dev/null
      [[ $? -eq 1 ]] && echo -e "\r\033[32mLe transfert est fini, \033[31m$A Mo \033[32mont ete copies, Tchao !\033[0m" && break
    done
    J'explique le script :

    Le principe est que j'ai simulé un upload de fichier dans un répertoire en créant un fichier de 100 Mo ==> dd if=/dev/zero of=lol bs=1024 count=102400 2> /dev/null &

    Je le lance en tâche de fond (le petit "&" ), pendant ce temps là le script va surveiller le remplissage du filesystem sur lequel est hébergé le répertoire cible d'une part et d'autre part suit la progression de l'upload du fichier et émet un message de fin de transfert quand c'est fait, cela ce fait avec la boucle while et le sleep.

    La détection du fin de transfert se fait par la surveillance du process correspondant au transfert (ici c'est la commande dd ==> ps -ef | grep "dd " | grep -v grep 1>/dev/null)

    Grâce au code retour de la commande (0 pour OK et 1 pour NOK), cela me permet de savoir si la commande est encore active ou non (il ne faut pas oublier de mettre le [ grep -v grep ] sinon le code retour sera toujours 0).

    Voilà un exemple de son utilisation :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    15000 Mo ont ete copies et il reste 2833158 Mo de libre
    32787 Mo ont ete copies et il reste 2815069 Mo de libre
    42120 Mo ont ete copies et il reste 2805997 Mo de libre
    82976 Mo ont ete copies et il reste 2765118 Mo de libre
    .
    .
    .Le transfert est fini, 102400 Mo ont ete copies, Tchao !
    Ce qu'il faut savoir c'est que l'affichage se superpose (on a pas de ligne les uns à la suite des autres comme dans l'exemple mais juste une ligne qui indique l'évolution du transfert)

    cela est possible grâce à cette commande "echo -e "\r\033[32m\033[31m$A Mo \033[32mont ete copies et il reste \033[31m$B Mo \033[32mde libre\033[0m \c" (retour charriot /r et suppression du saut de ligne /c)

    ATTENTION ! le echo -e ne marche qu'en bash, sinon le reste est transposable sur d'autres shells. Concernant ces balises ==> 033[32m\033[31, c'est pour mettre de la couleur afinque cela soit plus sympas à lire.

    C'est un petit script sans prétention, perfectible, pour ton cas il faudrait juste changer la commande dd par ce que tu lances pour ton transfert, et vérifier les sorties de df et ls.

    On pourrait aussi modifier les unité (Go en Mo ==>A=`echo "$A/1024" | bc`).

  10. #10
    Membre habitué Avatar de Levi59
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2011
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2011
    Messages : 58
    Points : 148
    Points
    148
    Par défaut
    La détection du fin de transfert se fait par la surveillance du process correspondant au transfert (ici c'est la commande dd ==> ps -ef | grep "dd " | grep -v grep 1>/dev/null)
    Pourquoi vers autant de pipes pour une commande qui peut être avantageusement remplacée par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (($(pgrep -c firefox))) && echo allumé || echo éteind

  11. #11
    Membre du Club
    Profil pro
    ingénieur
    Inscrit en
    Septembre 2008
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur

    Informations forums :
    Inscription : Septembre 2008
    Messages : 54
    Points : 57
    Points
    57
    Par défaut
    En effet levy59 on peut faire comme ça et certainement encore d'autres façons, c'est là l'intérêt d'optimiser un script

    Disons que la commande pgrep n'est pas forcément utilisé par tous

Discussions similaires

  1. Comment savoir si un fichier est en train d'etre lu ou accede?
    Par daniel_gre dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 20/09/2006, 11h47
  2. [Upload]comment savoir si un fichier est télécharger?
    Par ehmppowa dans le forum Langage
    Réponses: 12
    Dernier message: 23/01/2006, 19h43
  3. comment savoir si un fichier est un lien symbolique?
    Par trotters213 dans le forum C++
    Réponses: 2
    Dernier message: 02/12/2005, 12h55
  4. Comment savoir qu'un fichier est modifie
    Par moniphal dans le forum Langage
    Réponses: 2
    Dernier message: 02/10/2005, 10h26
  5. Unix - Comment savoir si un fichier est ouvert
    Par freddyboy dans le forum C
    Réponses: 7
    Dernier message: 06/10/2004, 15h53

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