tag:linuxfr.org,2005:/users/piaff33z/postsLinuxFr.org : les publications de piaff33z2017-03-05T10:22:30+01:00/favicon.pngtag:linuxfr.org,2005:Post/379462017-03-05T10:22:30+01:002017-03-05T15:21:31+01:00J'ai une colle pour les experts shell ou système.<p>J'ai une petite colle sur un comportement que je n'arrive pas à comprendre. Peut-être que certains d'entre vous pourront m'éclairer.</p>
<p>Tout d'abord la base. J'ai plusieurs machines qui envoient à une machine centrale des fichiers par ftp dans un dossier spécifique pour chaque machine émettrice. Jusque là simple…</p>
<p>Cette machine centrale qui reçoit ces fichiers à un rôle de dispatch des fichiers reçus dans d'autres dossiers en local en fonction de ceux-ci.</p>
<p>Au début, je faisais tourner un cron toutes les 5 min qui scannait l'ensemble des dossiers de réception et faisait le dispatch. Ça marchait très bien mais c'était pas optimum. Notamment je voulais réagir instantanément dés l'arrivée d'un fichier dans un dossier sans attendre les fameuses 5 min.</p>
<p>Pour cela, je me suis tourné vers <strong>incrond</strong> (<strong>produit génial</strong>) capable de lancer un script dès qu'il y a un mouvement sur le filesystem. Pour cela j'ai positionné une <strong>incrontab</strong> sur chacun des dossiers de réception et il faut avouer que cela marche très très bien !!!!</p>
<p>Néanmoins, je n'ai pas abandonné pour autant mon script d'origine.<br>
En effet, il est essentiel que je le conserve car dans le cas ou <strong>incrond devait être arrêté</strong>, il serait le seul à faire le boulot pour les fichiers qui auront été émis pendant l'arrêt d'incrond. Rappelez vous, incrond ne réagira que sur l'arrivée de nouveaux fichiers, pas sur ceux qui sont arrivés entre temps pendant qu'il ne regardait pas le filesystem ! Pour moi, ce script devient une sorte de script balai…</p>
<p>Voilà mon problème, j'aimerai pouvoir lancer ce script balai même quand <strong>incrond</strong> est en train de tourner. La plupart du temps, ce script ne devrait rien voir et ne pas prendre en charge de fichiers dans les dossiers de réception car <strong>incrond</strong> est très rapide et le script de dispatch est très court…</p>
<p>Néanmoins, si je le lance plusieurs fois d'affiler, il arrive quand même à attraper un fichier au vol malgré la rapidité d'<strong>incrond</strong> :-(. Forcément le traitement de ce script balai se passe mal car entretemps le fichier a disparu car pris en charge par le script lancé par <strong>incrond</strong>.</p>
<p>Pour éviter ce problème, j'ai une approche simple, le script balai teste la date de création du fichier par rapport à l'heure de maintenant.<br>
=> Si celle-ci est inférieure à 1 min, le fichier sera ignoré, car il pourrait être pris en charge par <strong>incrond</strong>.<br>
=> Si la différence est supérieure à 1 min, c'est qu'<strong>incrond</strong> ne l'a jamais vu donc il doit être pris en charge.</p>
<p>Voici un bout du script balai, ci-dessous :</p>
<p>J'ai décrit également la fonction diff_date() qui calcul la différence horaire…</p>
<pre><code class="bash"> ...
<span class="c1"># Fonction diff_date calcul la différence entre deux dates</span>
<span class="c1"># $1 Date d'orgine</span>
<span class="c1"># $2 Date de fin</span>
<span class="c1"># $3 affichage différence d,m,h,s ( jours, minutes, heures, secondes)</span>
<span class="k">function</span> diff_date<span class="o">()</span> <span class="o">{</span>
<span class="nb">local</span> FD SD P
<span class="o">[[</span> <span class="nv">$#</span> < <span class="m">2</span> <span class="o">]]</span> <span class="o">&&</span> <span class="k">return</span> <span class="m">1</span>
<span class="nv">FD</span><span class="o">=</span><span class="k">$(</span>date -d <span class="s2">"</span><span class="nv">$1</span><span class="s2">"</span> <span class="s2">"+%s"</span> <span class="m">2</span>> /dev/null<span class="k">)</span> <span class="o">||</span> <span class="k">return</span> <span class="m">1</span>
<span class="nv">SD</span><span class="o">=</span><span class="k">$(</span>date -d <span class="s2">"</span><span class="nv">$2</span><span class="s2">"</span> <span class="s2">"+%s"</span> <span class="m">2</span>> /dev/null<span class="k">)</span> <span class="o">||</span> <span class="k">return</span> <span class="m">1</span>
<span class="k">case</span> <span class="s2">"</span><span class="nv">$3</span><span class="s2">"</span> in
<span class="s2">"s"</span><span class="o">)</span> <span class="nv">P</span><span class="o">=</span><span class="m">1</span><span class="p">;;</span>
<span class="s2">"m"</span><span class="o">)</span> <span class="nv">P</span><span class="o">=</span><span class="m">60</span><span class="p">;;</span>
<span class="s2">"h"</span><span class="o">)</span> <span class="nv">P</span><span class="o">=</span><span class="m">3600</span><span class="p">;;</span>
<span class="s2">"d"</span> <span class="p">|</span> <span class="s2">""</span><span class="o">)</span> <span class="nv">P</span><span class="o">=</span><span class="m">86400</span><span class="p">;;</span>
*<span class="o">)</span> <span class="k">return</span> <span class="m">1</span><span class="p">;;</span>
<span class="k">esac</span>
<span class="nb">echo</span> -n <span class="k">$((</span> <span class="o">(</span><span class="nv">$FD</span> <span class="o">-</span> <span class="nv">$SD</span><span class="o">)/(</span><span class="nv">$P</span><span class="o">)</span> <span class="k">))</span>
<span class="o">}</span>
...
<span class="nv">IGNORE_TIME</span><span class="o">=</span><span class="m">1</span>
<span class="c1"># Test ci-dessous qui pose problème de temps en temps...</span>
<span class="o">[[</span> <span class="nv">$File</span> <span class="o">=</span>~ ^regexp_qui_valide_name_file$ <span class="o">]]</span> <span class="o">&&</span> <span class="o">((</span> <span class="k">$(</span>diff_date now <span class="s2">"</span><span class="k">$(</span>stat -c %y <span class="nv">$File</span> <span class="p">|</span> sed s/<span class="se">\\</span>..*$//<span class="k">)</span><span class="s2">"</span> m<span class="k">)</span> > <span class="nv">$IGNORE_TIME</span> <span class="o">))</span> <span class="o">&&</span> <span class="o">{</span>
...
<span class="c1"># Prise en charge du fichier</span>
...
<span class="o">}</span></code></pre>
<p>Mon soucis vient de la condition qui marche très bien la plupart du temps mais si j'insiste en appelant plusieurs fois celui-ci il arrive qu'elle laisse passer le traitement. Je ne comprends pas pourquoi !!!!</p>
<p>Avez vous une idée, du pourquoi ?</p><div><a href="https://linuxfr.org/forums/programmation-shell/posts/j-ai-une-colle-pour-les-experts-shell-ou-systeme.epub">Télécharger ce contenu au format EPUB</a></div> <p>
<strong>Commentaires :</strong>
<a href="//linuxfr.org/nodes/111390/comments.atom">voir le flux Atom</a>
<a href="https://linuxfr.org/forums/programmation-shell/posts/j-ai-une-colle-pour-les-experts-shell-ou-systeme#comments">ouvrir dans le navigateur</a>
</p>
piaff33zhttps://linuxfr.org/nodes/111390/comments.atom