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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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 : 25
    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 293
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 293
    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 : 25
    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
    887
    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 : 887
    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 : 25
    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 293
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 293
    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 ?

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