Bonjour à tous,
Je suis entrain d'écrire un petit script shell qui permet de surveiller l'arrivée d'un ou plusieurs fichiers dans un dossier afin de pouvoir déclencher un traitement spécifique selon le fichier. L'écriture du script en lui même ne pose pas trop de problème malgré le fait que je débute dans le scripting Shell.
Je travaille actuellement sur un vieux SCO UNIX OpenServer 5.0.5. Et il est là le problème !!!
Beaucoup de fonctions système ne sont pas disponibles et le jeux existant est pas mal vieux. Bien sur, impossible de trouver le moyen de mettre à jour proprement les librairies ou implémenter de nouvelles fonctions (gcc absent, glibc remaniée à la sauce SCO...). Et en plus je maitrise pas l'environnement (je me démerde un peut c'est tout).
J'arrive au but et expose mon problème :
Dans mon script, je fais une boucle de lecture du répertoire. Cette boucle est infinie (quasi). Je voulais positionner un "sleep" de quelque millisecondes en fin d'itération, afin d'éviter que le processeur ne s'emballe dans la boucle infinie. J'ai acquiers ce réflexe de programmation sur windows par pure précaution après des heures de lecture et d'avis différents. Le problème c'est que sous mon système, "sleep" ne prend que des entiers en secondes comme paramètre. Il n'existe pas de variante usleep ni nanosleep et je voudrais bien sur éviter d'endormir le script pendant 1 seconde à toutes les itérations (impensable même).
Voici le script en question :
Le code est encore à l'état de test mais je cherche depuis un moment pour trouver une solution, en vain.
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
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53 SHELL=/bin/sh PATH=/bin:/usr/bin:/usr/azur:/etc:. export PATH finboucle=false msgattente=true echo "*---------------------------------*" echo "|Gestionaire de procedures Tec-Com|" echo "*---------------------------------*" echo "" while [ $finboucle = false ] do if [ $msgattente = true ] then echo `date '+%x %X'` ": Attente de reception de fichier Tec-Com" msgattente=false fi if [ -r ./teccom*.txt ] then # Recuperation de la liste des fichiers teccom. listefichiers=`ls | grep "teccom"` # Recuperation du nom du premier fichier de la liste # (au cas ou il y en aurrait plusieurs). # Nota : Impossible d'acceder via ${listefichiers[0]} for mot in $listefichiers ; do fichier=$mot break echo `date '+%x %X'` ": Erreur : apres le break on ne devrait pas se trouver la !" done echo `date '+%x %X'` ": Nouveau fichier recu : $fichier" case $fichier in *disp*) echo `date '+%x %X'` ": Le ficher est une demande de dispo !" mv -f $fichier ./disp/ runcbl -c cblconfig ../gestion/objet/dispoauto2 $fichier;; *comm*) echo `date '+%x %X'` ": Le ficher est une commande immediate !" mv -f $fichier ./comm/;; *reap*) echo `date '+%x %X'` ": Le ficher est une commande de reapro !" mv -f $fichier ./reap/;;;; *);; esac msgattente=true fi # Le fameux sleep en seconde (c'est trop long !!!) sleep 1 done exit
D'où ma question qui tue : C'est grave sous UNIX docteur ?
J'ai fait des tests courts et le processeur n'a pas l'air de s'emballer. Cela peut-il arriver ? le script tournera au début, 10H par jour minimum et 24H/24H à terme. Puis-je me passer d'un "sleep" (ou équivalent) ?
Merci de me conseiller et désolé pour le post assez long mais je voulais être sur d'avoir tout dit pour que vous compreniez au mieux ma demande.
Merci d'avance !
Pilouche à tous
Partager