Attendre fin création fichier

sam -  
 sam -
Bonjour,
je dipose d'unordonnanceur qui detecte la création d'un fichier. Cependant même si la création du fichier est tujours en cours de part sa taille asser volumineuse, l'ordonnanceur déplace le fichier en question avant qu'il termine.
Mon idée est de lancer un script dés la création du fichier, ce script doit attendre jusqu'à ce qu'il n'y est plus d'écriture au niveau du fichier. Comment faire avec un script korn shell?

Merci d'avance.
A voir également:

8 réponses

jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 896
 
Salut,

Le fichier est créé comment ? Depuis où ? Qu'est-ce qui le crée ?
0
sam
 
Salut jipicy,
cela fait un bout de temps :) mais je vois que tu es fidéle à tes principes et je te remercie d'avance pour ton aide.
Le fichier est soit crée par une application J2EE, soit reçu par un CFT. dans les deux cas, il faudrait que j'attend la fin du transfert ou la fin de création du fichier avant que je n'opère mes traitements.
L'ordonnanceur déclenche son traitement dés que le fichier est crée dans le répertoire x.

Merci d'avance.
0
jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 896
 
Re-

Tu devrais peut être voir du côté de la commande "lsof".

Une commande du genre :

/usr/sbin/lsof  /chemin/fichier_en_cours_de_téléchargement


renvoie le PID du processus qui a ouvert le fichier, et rien lorsque le fichier est fermé.
Donc, avec une simple boucle qui vérifie si le fichier est ouvert devrait faire l'affaire, enfin je pense... ;-))

PS. Y'a peut être mieux et plus simple
0
dubcek Messages postés 18789 Date d'inscription   Statut Contributeur Dernière intervention   5 637
 
hello
créer le fichier ailleur et le déplacer dans le dossier x quand il est prêt
ou
créer le fichier sous un nom temporaire que l'ordonnanceur ne touchera pas (par ex .part comme Firefox) et le renommer à la fin
0
jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 896
 
Salut,

Ben ça revient au même non ? La difficulté étant de connaitre le moment où le téléchargement est fini ;-\
0
dubcek Messages postés 18789 Date d'inscription   Statut Contributeur Dernière intervention   5 637
 
L'ordonnanceur déclenche son traitement dés que le fichier est crée dans le répertoire x.
est ce que l'ordonnanceur est totalement (et aveuglement) automatique ou controlable ?
dans ton exemple, qui attend ?
0
sam
 
Salut,
l'ordonanceur est limité par rapport à tout ce qui est événementiel. l'évenement est déclenché dés la création du fichier indépendamment de la fin de création du fichier ou non :)
Pour la réponse de dubeck, elle n'est pas faisable dans mon scénario.
0
jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 896
 
As-tu essayé avec lsof ?
0
sam
 
non. Je vais voir ce que cela va donner.
Merci.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
sam
 
ça ne marche pas.
j'ai lancé une boucle indéfinie pour la création d'un fichier et en parrallèle j'ai testé avec "lsof /rep" rep : est le répertoire contenant le fichier ouvert/en cours d'écriture et cela ne me donne aucun résultat.
0
jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 896
 
Il faut le nom du fichier pour avoir un retour du PID qui a ouvert le fichier.
Sans le nom mais avec le répertoire il retourne (enfin chez moi sur un téléchargement avec "wget") le PID de bash et celui de wget :-\
0
sam
 
Salut jipicy,
j'ai procéder come suit. en ligne de commande j'ai lancé une boucle indéfinie pour la création d'un fichier dans le répertoire x. avec une autre session j'ai exécuter un lsof sur le répertoire et il ne me retourne pas le pid du fichier en cours de création.
Je vais creuser d'avantage.
Bonne journée.
0
dubcek Messages postés 18789 Date d'inscription   Statut Contributeur Dernière intervention   5 637
 
en surveillant le fichier pas le répertoire, ça fonctionne
$ 
$ for X in in $(seq 1 10) ; do date ;sleep 5;done >> /tmp/pipapou&
[1] 12066
$ 
$ lsof -l |grep pipapou
bash      12066     1000    1w      REG        8,1       60 343445 /tmp/pipapou
sleep     12071     1000    1w      REG        8,1       60 343445 /tmp/pipapou
...
$ lsof -l |grep pipapou
bash      12066     1000    1w      REG        8,1      330 343445 /tmp/pipapou
sleep     12238     1000    1w      REG        8,1      330 343445 /tmp/pipapou
$ lsof -l |grep pipapou
[1]+  Done                    for X in in $(seq 1 10);
do
    date; sleep 5;
done >> /tmp/pipapou
$ lsof -l |grep pipapou
$ lsof -l |grep pipapou
0
jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 896
 
C'est ce que je lui avait souligné ici ;-\

Merci pour le retour et l'exemple toutefois ;-)
0
sam
 
merci à vous tous :)
je vais le tester.
0