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

Linux Discussion :

Shell : Peur que le processeur s'emballe ?


Sujet :

Linux

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 13
    Points : 7
    Points
    7
    Par défaut Shell : Peur que le processeur s'emballe ?
    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 :
    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
    Le code est encore à l'état de test mais je cherche depuis un moment pour trouver une solution, en vain.

    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

  2. #2
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 720
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 720
    Points : 31 043
    Points
    31 043
    Billets dans le blog
    1
    Par défaut
    Vérifie si tu as la commande "usleep" présente sous Linux et qui travaille en ms. Sinon ben pourquoi ne pas la créer toi-même en C ??? C'est ça l'avantage de la conception modulaire. Si un outil manque ben on le crée soi-même...

    Concernant ton code, il peut s'améliorer.
    1) le while test machin != fin boucle => c'est du pur "programmation structurée bien apprise à l'école" mais parfois il faut savoir briser quelques règles étouffantes. Remplace-le donc par un "while true" (boucle infinie) et met un "break" quand tu veux quitter ta boucle. Tu éviteras de te prendre la tête avec des variables peu utiles

    2) comparer une variable "msgattente" à "true" et lui mettre "false" est pareil. Bien pensé mais peut encore s'améliorer. Vérifie simplement si elle est vide ("test -z") ou non ("test -n") et supprime-là simplement quand tu veux valider ton test => unset msgattente. Tu gagneras quelques précieuses microsecondes (le test vide/non-vide étant plus rapide qu'une comparaison lexicographique).

    3) concernant ta récupération de tous les fichiers contenant "teccom" dans le nom il y a plus simple => ls *teccom* ce qui t'évite un processus grep inutile. C'est utile seulement si tu cherches "teccom" sans différencier les majuscules => ls |grep -y teccom

    4) j'ai pas trop compris pourquoi tu récupères tous les fichiers contenant "teccom" dans le nom pour n'en extraire que le premier. Mais ta façon de récupérer ce premier mot est troublante. Déjà le echo erreur est franchement inutile car le break te fera sortir mais POURQUOI remplir une variable "mot" pour la recopier dans "fichier" ???
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for fichier in $listefichiers ; do
            break
    done
    Maintenant, pour éviter cette boucle qui ne fait qu'une itération, autant récupérer directement juste le premier nom => ls *teccom* |head -1

    5) le *);; dans le case est inutile (sauf si ça doit évoluer un jour)

    Bon enfin malgré tout j'aime bien ton code. Pour un débutant en script tu te débrouilles pas mal. Maîtrise des pipes, des substitution de commandes (les ` `), bref tu connais ce qu'il y a de plus important. Le reste ça viendra avec l'habitude...

    Si tu veux suivre un cours de shell Linux => http://linux.developpez.com/cours/

    [edit]Je viens de relire ton message. T'as pas de gcc donc tu peux pas créer ton outil (super l'environnement de m.... dans lequel on te fait bosser !!!). Alors il y a une autre solution
    1) tu crées ton script sans te préoccuper de son possible emballement et tu vires ton sleep que tu ne veux d'ailleurs pas
    2) tu lances ton script sous un "nice" => nice -20 script.sh. Cela demandera au système d'exécuter ton script avec une priorité plus faible (les valeurs possibles vont de -1 à -20) que les autres programmes.
    Pour un programme, sa priorité est généralement autour de 60 (une priorité peut aller de 1 à 100 avec 1 très rapide et 100 très lent). En demandant un nice -20, tu demandes au système de placer la priorité de ton script autour de 80. Par ailleurs seul root a le droit de faire un nice négatif (nice --n) rendant ainsi un programme plus rapide que les autres donc un utilisateur ne peut que avoir une priorité normale ou plus faible que les autres.

    Et si tu veux que ton programme soit automatiquement mis en priorité faible, tu mets la commande "nice -20" en début de code.

    Ainsi, le système donnera la main à ton script quand il n'a rien d'autre à faire. Et donc ton script ne pourra pas bouffer les précieuses ressources de ta top machine...

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 13
    Points : 7
    Points
    7
    Par défaut
    Salut Sve@r, salut à tous.

    Merci de ta réponse rapide et très argumentée.
    Ça fait bien plaisir

    On va faire par numéro ça sera plus simple :

    Pour le 1) Oui je suis trop "cas d'école" j'avoue... Mais aussi je suis très méfiant et presque parano . En fait je me suis dit qu'un tel test dans le while prendrai effectivement plus de temps et ralentirait les itérations (toujours la même peur de l'emballement et du freez de la machine). Mais bon j'avoue aussi que j'abuse ptet un peut là

    Pour le 2) Je n'y ai pas pensé, ne cherchant pas une exécution ultra rapide (tfacon vu la machine, ça irait pas très vite ) mais je vais voir ça de plus près et surement modifier ces lignes vu que c'est plus performant.

    Pour le 3) Ha ouais ? Mouarf il faut que je lise les *man* jusqu'au bout !!

    Pour le 4) Re ha ouais ? Pour l'itération c'est d'une logique implacable (suis-je bête) et pour le "head -1", encore un truc que je savais pas !!! Autant dire qu'effectivement le 3) et 4) finira par un joli : ls *teccom* |head -1 (Merci !!!)

    Pour le 5) oui ça devrait évoluer car il y aura un traitement si aucun cas n'a été trouvé.

    Au passage, merci pour les compliments, en fait j'apprends les différents langages selon le besoin du moment d'ailleurs je suis arriver sur cette machine avec un applicatif ecrit en COBOL 85 que j'avais vu de ma vie (hahaha j'ai faillit faire une crise cardiaque le premier jour).

    Concernant gcc, je bataille pour l'installer sur la machine mais je fais très attention car je n'ai pas de machine de test (impossible de mettre la main sur les binaires d'install c'est fou ça !!!) et la moindre erreur aurait de trop lourde conséquences sur l'activité de l'entreprise.

    Concernant nice, je peux être sur que le script ne s'emballera pas ? la priorité faible m'assurera la stabilité du script ? Ça serait tellement merveilleux .

    En tout cas je te remercie vraiment pour tes conseils et pour cette solution qui pourra peut être m'éviter de mal dormir la nuit en pensant que la boucle tourne encore sans contrôle

    A Plus et Merci !

  4. #4
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 720
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 720
    Points : 31 043
    Points
    31 043
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Pitchou`n Voir le message
    Pour le 3) Ha ouais ? Mouarf il faut que je lise les *man* jusqu'au bout !!
    C'est pas une histoire de man. C'est simplement la possibilité que tu as d'utiliser les métacaractères pour nommer un fichier. Ca peut donc marcher aussi pour "cd", "cp", "vi" bref toute commande à laquelle on lui passe un nom de fichier. Lorsque le shell (car ton interface en lignes de commandes est aussi un shell) attrape ta commande, il remplace les "*" par "tout fichier présent actuellement dont le nom correspond".
    Tape "echo *" et tu verras apparaitre "echo xxx yyy zzzz ... (tous tes fichiers quoi)"

    Citation Envoyé par Pitchou`n Voir le message
    Concernant gcc, je bataille pour l'installer sur la machine mais je fais très attention car je n'ai pas de machine de test (impossible de mettre la main sur les binaires d'install c'est fou ça !!!) et la moindre erreur aurait de trop lourde conséquences sur l'activité de l'entreprise.
    Chope-toi n'importe quelle bouzine (putain une entreprise ça devrait avoir au-moins un truc d'il y a 5 ans rangé dans un placard car jugé trop vieux) et mets-y un petit Linux (style Fedora Core). Pas gourmand, t'auras au-moins les mains libres.
    Ou alors Knoppix => un dvd contenant un système Linux complet et fonctionnel. Tu bootes sur le DVD, t'as un linux qui se charge en mémoire (absolument rien n'est écrit sur le disque), tu peux bosser avec tranquille sans crainte (tu écrits tes fichiers sur clef USB) puis quand t'en as marre, tu rebootes sur le disque dur et tu repars sur le système d'origine.

    Citation Envoyé par Pitchou`n Voir le message
    Concernant nice, je peux être sur que le script ne s'emballera pas ? la priorité faible m'assurera la stabilité du script ? Ça serait tellement merveilleux .
    Certain. Toutefois la stabilité d'un script ne dépend pas de sa vitesse d'exécution. De plus, penser qu'un script shell (interprété donc très lent à la base) pourra "s'emballer"...

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 13
    Points : 7
    Points
    7
    Par défaut
    Salut salut,

    Avec ta réponse, je peux imaginer que mon problème est "résolu" dans le sens ou une solution a été trouvée et les conseils donnés.

    Il me reste plus qu'à appliquer certains de tes conseils et appuyer mes recherche sur l'utilisation de 'nice'.

    Je vais tout de même tenter de trouver un moyen d'installer GCC pour SCO OSR5, histoire d'avoir plus de liberté de programmation dans l'avenir.

    Je te remercie en tout cas pour tes lumières et je retourne bosser

    A bientôt Sve@r et Pilouche tout le monde !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Shell commande "une fois que"
    Par coincoin22 dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 26/07/2007, 21h03
  2. Le temps que la commande "grep" en shell prend
    Par Pauli dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 25/12/2006, 19h59
  3. Executer en tant que en shell script ?
    Par fabszn dans le forum Linux
    Réponses: 3
    Dernier message: 13/01/2006, 15h08
  4. Utiliser que le processeur
    Par Neilos dans le forum OpenGL
    Réponses: 5
    Dernier message: 31/07/2005, 11h24

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