Précédent   Forum des professionnels en informatique > Systèmes > Linux > Applications > Shell
Shell Vos questions sur l'utilisation des commandes shell
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 15/11/2011, 12h13   #1
Invité régulier
 
Développeur Web
Inscription : avril 2011
Messages : 5
Détails du profil
Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : avril 2011
Messages : 5
Points : 5
Points : 5
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.
rhesus est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 15/11/2011, 12h41   #2
Membre Expert
 
Homme
budget et contrôle de gestion
Inscription : décembre 2006
Messages : 895
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 44
Localisation : France

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

Informations forums :
Inscription : décembre 2006
Messages : 895
Points : 1 543
Points : 1 543
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 :
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 :
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é.
__________________
Winnt

C'est en Linuxant qu'on devient .... geek

Intel Core i5 750 / 8 Go ram / Hdd 2 To / NVIDIA GeForce GTS 250 1Go sous Gentoo.
Dual core E6300 / 2Go ram / Hdd 1 To / Ati 9800XT sous Debian Testing.
Atom N330 / 4Go ram / Hdd 5To / intel GMA 950 sous Debian Testing

Ici un article de présentation de la distribution Gentoo http://winnt.developpez.com/tutoriel...tation-gentoo/
Winnt est actuellement connecté   Envoyer un message privé Réponse avec citation 10
Vieux 15/11/2011, 13h52   #3
Expert Confirmé Sénior
 
Avatar de frp31
 
Homme francois
Ingénieur systèmes et réseaux
Inscription : juillet 2006
Messages : 3 538
Détails du profil
Informations personnelles :
Nom : Homme francois
Âge : 35
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 : 3 538
Points : 7 754
Points : 7 754
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....
frp31 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/11/2011, 17h16   #4
Membre Expert
 
Homme
budget et contrôle de gestion
Inscription : décembre 2006
Messages : 895
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 44
Localisation : France

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

Informations forums :
Inscription : décembre 2006
Messages : 895
Points : 1 543
Points : 1 543
Salut,

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

C'est en Linuxant qu'on devient .... geek

Intel Core i5 750 / 8 Go ram / Hdd 2 To / NVIDIA GeForce GTS 250 1Go sous Gentoo.
Dual core E6300 / 2Go ram / Hdd 1 To / Ati 9800XT sous Debian Testing.
Atom N330 / 4Go ram / Hdd 5To / intel GMA 950 sous Debian Testing

Ici un article de présentation de la distribution Gentoo http://winnt.developpez.com/tutoriel...tation-gentoo/
Winnt est actuellement connecté   Envoyer un message privé Réponse avec citation 10
Vieux 16/11/2011, 08h44   #5
Expert Confirmé Sénior
 
Avatar de frp31
 
Homme francois
Ingénieur systèmes et réseaux
Inscription : juillet 2006
Messages : 3 538
Détails du profil
Informations personnelles :
Nom : Homme francois
Âge : 35
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 : 3 538
Points : 7 754
Points : 7 754
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.
frp31 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/11/2011, 09h20   #6
Membre Expert
 
Homme
budget et contrôle de gestion
Inscription : décembre 2006
Messages : 895
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 44
Localisation : France

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

Informations forums :
Inscription : décembre 2006
Messages : 895
Points : 1 543
Points : 1 543
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 ).
__________________
Winnt

C'est en Linuxant qu'on devient .... geek

Intel Core i5 750 / 8 Go ram / Hdd 2 To / NVIDIA GeForce GTS 250 1Go sous Gentoo.
Dual core E6300 / 2Go ram / Hdd 1 To / Ati 9800XT sous Debian Testing.
Atom N330 / 4Go ram / Hdd 5To / intel GMA 950 sous Debian Testing

Ici un article de présentation de la distribution Gentoo http://winnt.developpez.com/tutoriel...tation-gentoo/
Winnt est actuellement connecté   Envoyer un message privé Réponse avec citation 10
Vieux 16/11/2011, 10h32   #7
Invité régulier
 
Développeur Web
Inscription : avril 2011
Messages : 5
Détails du profil
Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : avril 2011
Messages : 5
Points : 5
Points : 5
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.
rhesus est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 16/11/2011, 13h19   #8
Expert Confirmé Sénior
 
Avatar de frp31
 
Homme francois
Ingénieur systèmes et réseaux
Inscription : juillet 2006
Messages : 3 538
Détails du profil
Informations personnelles :
Nom : Homme francois
Âge : 35
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 : 3 538
Points : 7 754
Points : 7 754
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
frp31 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/11/2011, 10h53   #9
Futur Membre du Club
 
Inscription : septembre 2008
Messages : 37
Détails du profil
Informations forums :
Inscription : septembre 2008
Messages : 37
Points : 19
Points : 19
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 :
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 :
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`).
sedawk est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/11/2011, 16h39   #10
Membre habitué
 
Avatar de Levi59
 
Homme
Étudiant
Inscription : août 2011
Messages : 46
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : août 2011
Messages : 46
Points : 126
Points : 126
Citation:
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 :
(($(pgrep -c firefox))) && echo allumé || echo éteind
__________________
Carpe Diem
Levi59 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/11/2011, 20h05   #11
Futur Membre du Club
 
Inscription : septembre 2008
Messages : 37
Détails du profil
Informations forums :
Inscription : septembre 2008
Messages : 37
Points : 19
Points : 19
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
sedawk est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 13h19.


 
 
 
 
Partenaires

Hébergement Web