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

Shell et commandes GNU Discussion :

Une boucle provoque une consommation CPU excessive


Sujet :

Shell et commandes GNU

  1. #1
    Candidat au Club
    Homme Profil pro
    Technicien réseaux et télécoms
    Inscrit en
    Septembre 2020
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Technicien réseaux et télécoms
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Septembre 2020
    Messages : 3
    Par défaut Une boucle provoque une consommation CPU excessive
    Bonjours a vous !,

    (je m'excuse si ne publie pas correctement sur le forum c'est ma première fois)

    j’aimerai tout bonnement faire un script shell qui m'envoie par mail tout les 24h avec dedans : un état d'un site internet et si le serveur est up ou encore le temps de chargement de la page.

    En ce qui concerne la gestion du ping, la création d'un tableau pour stocker les variables et l'envoi d'un mail tout fonctionne correctement dans des script séparée, sauf qu'il faut que je regroupe tout en un.

    c'est la que cela coinces par exemple avec le code ci-joint le script n’exécute pas commande (ou variable ) pong, il reste bloquer sur le premier echo et utilise toutes la ressources cpu.

    Je suis (malheureusement) débutant en script, je ne vois pas ce qui cloche .


    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
    54
    55
    56
    57
    58
    59
     
    #!/bin/bash
     
    rep=1
    let "testHeure=0"
     
     
    #fonction qui fait que le script tourne en boucle 
    function tourneEnBoucle {
        echo -e "\n"
    }
     
     
     
    function ping  {
        heure=$(date +%Hh%M)
        echo "Est ce que je rentre dans le ping"
     
        ########LE PING########BASTIEN
     
        pong=$(ping -c 2 -q -w 1 xx.xx.xx.xx|grep rtt | cut -d "/" -f5 | cut -c 1-2);
        #Le ping échoue quand le temps de rep dépasse 1s .
     
        echo -e "$(date): ttr $pong ms\n"; 
        #Affiche l'heure et la date en plus de la valeur du temps de ping 
     
     
        # Defini si la variable pong est nul ou non, si non lance le chargement de la page :
        if [ -n "$pong" ] #si le ping est ok, l'on passe au chargement du site web.
        then 
            tempsLoadingSite=$(curl -m 2 -s -o /dev/null -w '%{time_total}\n' https://www.xxx.fr);
     
            # le curl charge le site en mode silencieux -m 2 timeout 2s , le -o l'enregistre dans la "poubelle" puis -w (write out)qui va nous afficher 
            #la varaible time_total en secondes
     
     
            echo "le site est good, $tempsLoadingSite s de chargement  "
        else
            echo "Le ping ne fonctionne pas "
        fi
     
        ########LE PING########
     
     
        if [ $heure = "16h56" ] && [ $testHeure -eq 1 ]
        then
            let "testHeure=0"
        fi
     
        sleep 5
    }
     
     
     
    while [ "$rep" -eq 1 ]
    do
        ping
        tourneEnBoucle
    done


    Un grand merci pour votre aide ou pour votre explication !

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Août 2010
    Messages
    345
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 345
    Par défaut
    Salut,
    J'ai pas trop regardé et je peux me tromper mais ...
    ping {
    pong= $(ping ...)
    }
    on relance ping ...
    pong=$(ping ...)
    ...
    Je pense que les noms des fonctions sont bien choisies.
    Cordialement.

  3. #3
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 308
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 308
    Par défaut
    Bonjour

    #fonction qui fait que le script tourne en boucle
    function tourneEnBoucle {
    echo -e "\n"
    }
    Non. Ce qui fait que ça tourne en boucle, ce n'est pas cette fonction anodine, mais la boucle infinie immonde qui est à la fin du script. Aucun programme informatique au monde n'a jamais tourné à l'infini. Alors mets une condition d'arrêt crédible. Ou mieux, enlève cette boucle inutile.

    function ping {
    Pas très malin d'appeler une fonction comme une commande. Regarde ma console :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $ function ping { echo ok;}
    $ ping
    ok
    $ ping -c 2 -q -w 1 google.com
    ok
    $
    Tu vois le problème ? Quand j'ai voulu pinguer Google, il a cru que j'appelais la fonction et non la commande et rien n'a marché.


    Enfin, voici un site pour vérifier la syntaxe de ton code :
    https://www.shellcheck.net/

  4. #4
    Candidat au Club
    Homme Profil pro
    Technicien réseaux et télécoms
    Inscrit en
    Septembre 2020
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Technicien réseaux et télécoms
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Septembre 2020
    Messages : 3
    Par défaut
    Re-Bonsoir,

    Donc j'ai bien vérifié le code avec le shellCheck d’après le site c'est ok pour l'instant, j'ai aussi modifié le nom de la fonction ping par faitping et cela fonctionne top merci beaucoup ! ,

    Par contre je veux bien que tu m'expliques (ou un lien web) pour dégager la boucle infinie ^^ car je voudrais juste que le script fasse la boucle faitping toutes les 15 min en gros, et que après la vérification de l’heure il envoie un mail.

    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
    54
    55
    56
    57
    #!/bin/bash
     
    rep=1
    ((testHeure=0))
     
     
    #fonction qui fait que le scrit tourne en boucle function tourneEnBoucle
     
     
     
    function faitping  {
    	heure=$(date +%Hh%M)
    	echo "Est ce que je rentre dans le ping"
     
    	########LE PING########BASTIEN ET KAELIG
     
    	pong=$(ping -c 2 -q -w 1 195.83.167.102 |grep rtt | cut -d "/" -f5 | cut -c 1-2);
    	#Le ping échoue quand le temps de rep dépasse 1s .
     
    	echo -e "$(date): ttr $pong ms\n"; 
    	#Affiche l'heure et la date en plus de la valeur du temps de ping 
     
     
    	# Defini si la variable pong est nul ou non, si non lance le chargement de la page :
    	if [ -n "$pong" ] #si le ping est ok, l'on passe au chargement du site web.
    	then 
    		tempsLoadingSite=$(curl -m 2 -s -o /dev/null -w '%{time_total}\n' https://www.ac-nantes.fr);
     
    		# le curl charge le site en mode silencieux -m 2 timeout 2s , le -o l'enregistre dans la "poubelle" puis -w (write out)qui va nous afficher 
    		#la varaible time_total en secondes
    		#tsite2=$(time wget -E -H -k -K -p -nv -q https://www.ac-nantes.fr | awk '{print $3,$4}'); Non fonctionelle pour nous  
     
    		echo "le site est good, $tempsLoadingSite s de chargement ヾ(≧∇≦)ゞ "
    	else
    		echo "Le ping ne fonctionne pas ╥﹏╥ "
    	fi
     
    	########LE PING########
     
     
    	if [ "$heure" = "21h51" ] && [ "$testHeure" -eq 1 ]
      echo "$testHeure "
        then
    		((testHeure=0))
     
    	fi
     
    	sleep 5
    }
     
     
     
    while [ "$rep" -eq 1 ]
    do
    	faitping
     
    done

  5. #5
    Membre Expert Avatar de Ti-Slackeux
    Homme Profil pro
    Robotique
    Inscrit en
    Août 2007
    Messages
    1 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Robotique

    Informations forums :
    Inscription : Août 2007
    Messages : 1 073
    Par défaut
    Bonsoir,

    Juste comme ça, mais un script qui fait le boulot une fois et s'arrete c'est moins de soucis non ?
    après un cron pour le faire tourner toutes les 24 heures ça devrait faire l'affaire ?

    hth,

  6. #6
    Candidat au Club
    Homme Profil pro
    Technicien réseaux et télécoms
    Inscrit en
    Septembre 2020
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Technicien réseaux et télécoms
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Septembre 2020
    Messages : 3
    Par défaut
    Bonsoir,

    Oui j'y avais pensé mais pas possible d'utiliser cron tab ici , sinon oui cela aurait été beaucoup plus simple effectivement!

  7. #7
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 308
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 308
    Par défaut
    Ti-Slackeux a raison. C'est le boulot de cron.

    Sinon :
    Quant à la boucle infinie, je vois bien que tu initialises $rep, que tu testes $rep, mais je ne vois pas où tu modifies rep afin d'arrêter la boucle. Ai-je la berlue ?

  8. #8
    Invité
    Invité(e)
    Par défaut
    pas possible d'utiliser crontab ici
    et pourquoi cela ?

  9. #9
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 431
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 431
    Par défaut
    Bon, déjà, pourquoi un ping puis un curl ensuite puisque de toute façon, ce que tu récupères en cas de succès c'est la durée de chargement de la page ?
    A la rigueur, un curl puis un ping si la durée du curl ne convient pas pour voir si c'est réseau ou appli serait plus logique: perso, je ne ferais que le curl, car dans tous les cas, il doit y avoir intervention si problème...

    Et mon coup de gueule:
    Si pas droit au cron, tu précises à ta direction que le script est fait, il n'y a plus qu'à le lancer aux heures que vous désirez et tu retires ta boucle infinie ou tout subterfuge qui pourrait remplacer un outil tel que cron.

    Des fois, faut arrêter d'écouter des abrutis qui décident entre autre que cron c'est pas bien mais ne proposent rien en retour.

    Et d'ailleurs, tu auras l'air bien malin, si pour une raison ou une autre, ton script s'arrête... comment tu le détectes ?

    Et quand tu auras une centaine de scripts de la sorte, imagine le bordel...

    cron n'est pas parfait, mais faute de mieux, en général, il fait le job.

  10. #10
    Invité
    Invité(e)
    Par défaut
    un admin peut interdire cron, mais peut-il interdire l'instance utilisateur de systemd, ou simplement n'est-ce pas configuré par défaut ?
    à condition bien sûr que systemd soit installé !

  11. #11
    Modérateur
    Avatar de gangsoleil
    Homme Profil pro
    Manager / Cyber Sécurité
    Inscrit en
    Mai 2004
    Messages
    10 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Manager / Cyber Sécurité

    Informations forums :
    Inscription : Mai 2004
    Messages : 10 150
    Par défaut
    Bonjour,

    Je suis d'accord avec ce qui a été dit précédemment, que je récapitule donc :
    - c'est le boulot de cron, systemd ou un autre outil du genre (ordonnanceur ?)de lancer un script régulièrement, donc tu as intérêt à te baser là dessus. Comme évoqué, comment vas-tu faire pour savoir si ton programme tourne toujours ? Tu fais un autre script, qui boucle aussi, pour faire un ps toutes les N secondes ? Et ce même script, qui le surveille ?
    - Si vraiment tu ne peux pas utiliser un de ces outils, mets un "sleep N" dans ton code. L'attente active bouffe le CPU, donc c'est à proscrire. Clairement, ce n'est pas la bonne solution, mais c'est déjà mieux
    - Pourquoi ping puis curl ? Un appel à curl tout seul ne te suffit pas ? Et pourtant, si le site distant tombe entre le ping et le curl, c'est bien le même cas non ?
    - La variable rep ne sert à rien dans ton script. Ce que tu as écrit revient à "while true", car rep n'est jamais modifiée. À toi de trouver des cas de sortie.
    "La route est longue, mais le chemin est libre" -- https://framasoft.org/
    Les règles du forum

Discussions similaires

  1. Réponses: 5
    Dernier message: 14/10/2016, 10h16
  2. Analyse d'une consommation DB2
    Par sam01 dans le forum DB2
    Réponses: 4
    Dernier message: 23/01/2014, 10h46
  3. Consommation CPU WPF/DirectX dans une D3DImage
    Par Patsux dans le forum Windows Presentation Foundation
    Réponses: 6
    Dernier message: 13/03/2013, 10h33
  4. [Images] Erreur liée à une consommation excessive de mémoire
    Par cyrill.gremaud dans le forum Bibliothèques et frameworks
    Réponses: 15
    Dernier message: 04/11/2007, 22h55
  5. Réponses: 17
    Dernier message: 10/08/2006, 01h31

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