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 :

Script qui contrôle la ressource d'un exécutable


Sujet :

Shell et commandes GNU

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2011
    Messages
    88
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2011
    Messages : 88
    Points : 49
    Points
    49
    Par défaut Script qui contrôle la ressource d'un exécutable
    Bonjour,

    J'ai un dédié sous linux centos. J'aimerai une aide sur la réalisation d'un petit script qui check toutes les 1ou 2-3 secondes si un programme X use plus de 1 gb de mémoire ( ram ) alors il me prévient via un log avec la date et l'heure/seconde et kill le script pour éviter le flood.

    Donc si programme X est > à 1gb de mémoire alors log date/haure "blabla" et kill script.

    Merci

    ps: je sais pas trop ou mettre ce sujet tellement il y a de choix. ( je pense qu'ici est le meilleur choix au final )

  2. #2
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 550
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 550
    Points : 19 383
    Points
    19 383
    Par défaut
    Bonjour,

    il te faut récupérer les informations concernant
    la mémoire système, depuis /proc/meminfo
    la mémoire utilisée par le processus, depuis /proc/<PIDprocsess>/statm
    (ce qui implique de connaître le PID du processus surveillé)

    et comparer ces informations dans une boucle infinie "temporisée" toutes les 1-3 secondes.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #3
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2011
    Messages
    88
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2011
    Messages : 88
    Points : 49
    Points
    49
    Par défaut
    Bonjour,

    Merci d'avoir répondu mais je n'ai aucune compétence la dessus, ça serait pour une aide un peu plus grande.

    Merci.

    edit:

    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
     
    ps -eo fname,rss | awk '!/RSS/{ if ($2 > 500000) print $1}' >/tmp/tempfile
    test -s /tmp/tempfile &&
    (
    //echo HELO test.com
    sleep 2
    echo "mail from:<test@mail.com>"
    sleep 2
    echo "RCPT TO:<mailto@server.com>"
    sleep 2
    echo DATA
    sleep 2
    cat /tmp/tempfile
    echo .
    echo QUIT
    sleep 2) | telnet 1.*.*.* 25
    rm /tmp/tempfile
    From: test@mail.com
    To: mailto@server.com
    Subject: Processes taking more than 500MB
     
    These processes are taking more than 500MB RAM.
    Please check it.
    Bout de script trouvé sur le net, pour une base de travail.

  4. #4
    Rédacteur

    Avatar de ok.Idriss
    Homme Profil pro
    IS Consultant
    Inscrit en
    Février 2009
    Messages
    5 220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : IS Consultant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2009
    Messages : 5 220
    Points : 19 452
    Points
    19 452
    Par défaut
    Bonjour.

    Ce bout de code que tu ne maîtrise absolument pas et qui n'a rien à voir avec ta problématique, tu peux l'oublier

    Pour récupérer le pid de ton processus tu peux te servir de la commande ps et de grep

    Exemple avec firefox :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ps -ef | grep firefox | awk -F " " '{print $2}'
    à partir de là tu peux récupérer les pids dans une variable et parcourir :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    listPid=$(ps -ef | grep firefox | awk -F " " '{print $2}')
     
    while read pid; do # Pour chaque pid
    #...
    done <<< $listPid
    Grâce aux indications de N_Bah tu récupère la mémoire consommée par le processus et tu kill si ça dépasse la valeur que tu veux.

    Et enfin tu met tout ça dans une boucle infini avec un sleep pour attendre 3 secondes avant de passer à l'itération suivante.

    Et si tu veux que ce script soit lancé à chaque démarrage, tu as le fichier /etc/init.d/rc.local pour ça.

    Bref, avec ça + les manpages tu as tout ce qu'il te faut pour réussir. Il faut fournir davantage d'efforts

    Cordialement,
    Idriss

  5. #5
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2011
    Messages
    88
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2011
    Messages : 88
    Points : 49
    Points
    49
    Par défaut
    Merci de répondre et prendre son temps pour m'aider.

    http://www.unix.com/shell-programmin...e-process.html

    voici la source du script, ça semble être la même aide que moi non?

    J'utilise:
    pid = 29125
    user= stun
    command = abc ( programe )

  6. #6
    Rédacteur

    Avatar de ok.Idriss
    Homme Profil pro
    IS Consultant
    Inscrit en
    Février 2009
    Messages
    5 220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : IS Consultant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2009
    Messages : 5 220
    Points : 19 452
    Points
    19 452
    Par défaut
    Re bonjour.

    Citation Envoyé par maloy Voir le message
    voici la source du script, ça semble être la même aide que moi non?
    De loin. Là il envoie des mails, il kill pas, et t'as plusieurs spécificités dans ton besoin et dans son besoin qui font que c'est une perte de temps de faire un gros copier coller sans comprendre ce que ça fait. Ça ne fera pas ce que tu attends toi.

    Donc il vaut mieux partir sur le développement de ton script à toi avec les éléments qu'on te donne, et le fruit de recherches personnelles mais qui ne doivent pas te donner de grosses solutions toutes faites inadaptées à ton besoin (les exemples de script et de commandes, c'est bien de t'en servir mais tu dois prendre uniquement ce dont tu as besoin et l'adapter).

    Cordialement,
    Idriss

  7. #7
    Expert confirmé
    Avatar de becket
    Profil pro
    Informaticien multitâches
    Inscrit en
    Février 2005
    Messages
    2 854
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Informaticien multitâches
    Secteur : Service public

    Informations forums :
    Inscription : Février 2005
    Messages : 2 854
    Points : 5 915
    Points
    5 915
    Par défaut
    Il me semble que le grep est inutile ici
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    listPid=$(ps -ef | grep firefox | awk -F " " '{print $2}')
    On peut le remplacer par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    listPid=$(ps -ef | awk -F " " '/firefox/{print $2}')

  8. #8
    Rédacteur

    Avatar de ok.Idriss
    Homme Profil pro
    IS Consultant
    Inscrit en
    Février 2009
    Messages
    5 220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : IS Consultant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2009
    Messages : 5 220
    Points : 19 452
    Points
    19 452
    Par défaut
    C'est pas faux

  9. #9
    Expert éminent

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 946
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 946
    Points : 6 276
    Points
    6 276
    Par défaut
    Salut,

    Citation Envoyé par becket Voir le message
    Il me semble que le grep est inutile ici
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    listPid=$(ps -ef | grep firefox | awk -F " " '{print $2}')
    On peut le remplacer par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    listPid=$(ps -ef | awk -F " " '/firefox/{print $2}')
    Ou tout simplement par listPid=$(pgrep fiferox)

    Sinon pour la forme employée avec "awk" (ou grep), il vaut mieux écrire la syntaxe comme suit : ps -ef | awk -F " " '/fir[e]fox/{print $2}', sans quoi le PID de "awk" (ou grep) est renvoyé en même temps
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $ ps -ef | awk -F " " '/firefox/{print}'
    jp       17311     1  8 13:13 ?        00:15:21 /usr/lib/firefox/firefox
    jp       26600  4000  0 16:06 pts/0    00:00:00 awk -F   /firefox/{print}
     
    $ ps -ef | awk -F " " '/fir[e]fox/{print}'
    jp       17311     1  8 13:13 ?        00:15:22 /usr/lib/firefox/firefox
    $ man woman
    Il n'y a pas de page de manuel pour woman.

  10. #10
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2011
    Messages
    88
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2011
    Messages : 88
    Points : 49
    Points
    49
    Par défaut
    Je n'ai pas de connaissance à ce sujet, et apprendre ça se fait pas en 2 secondes sachant qu'ici le but est de contrôler un programme et non de me lancer dans la développement/programmation la dessus. Comprendre à partir d'une base pour ensuite éditer est une chose, en faire une est autre chose, c'est pour ça que j'ai pris en exemple le script.

    Que ça soit dans un log ou bien dans l'envoi d'un mail c'est pas un soucis. S'il faut juste rajouter un kill et modifier quelques trucs sur cette base, je pense c'est plus simple, que de partir à 0 ou je ne m'y connais pas. Je suis prêt a payer pour ça si je trouve pas d'aide ici, mais avant je voulais connaître si des personnes avaient déjà fait ça.

  11. #11
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 859
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 859
    Points : 218 580
    Points
    218 580
    Billets dans le blog
    120
    Par défaut
    Bonjour,

    Il existe aussi des solutions utilisants les cgroups afin de limiter les ressources allouées à un processus (mémoire/CPU/réseau ). Cela peut être une voie à explorer.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  12. #12
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2011
    Messages
    88
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2011
    Messages : 88
    Points : 49
    Points
    49
    Par défaut
    oui mais c'est pas ce que je recherche, c'est de savoir a X moment quand un programme utilise trop de ressource pour ensuite trouver le problème via les logs.

  13. #13
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 550
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 550
    Points : 19 383
    Points
    19 383
    Par défaut
    allez
    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
    #!/bin/bash
     
    taCommandeAsurveiller= #???
     
    pidCmd=$(pgrep $taCommandeAsurveiller)
     
    while sleep $((RANDOM%3+1))
    do
    #   read _ rss _ < <(grep VmRSS /proc/$$/status) #oops, ça c'est la consommation mémoire du script courant
       read _ rss _ < <(grep VmRSS /proc/$pidCmd/status)
       test $rss -ge 1000000 && {
          # kill $pidCmd
          mail -s "alerte" user@localhost <<<"$rss"
          exit
       }
    done
    tu libelleras ton chèque aux Œuvres des lutins du Père Noël.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  14. #14
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2011
    Messages
    88
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2011
    Messages : 88
    Points : 49
    Points
    49
    Par défaut SMS à éviter code ou pas code
    Désolé de la réponse tardive.

    Merci à toi d'user de ton temps afin rendre service.

    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
    #!/bin/bash
     
    taCommandeAsurveiller= abc #nom donne dans top
     
    pidCmd=$(pgrep $taCommandeAsurveiller)
     
    while sleep $((RANDOM%3+1))    #cela représente un random de combien je comprends pas trop ça
    do
       read _ rss _ < <(grep VmRSS /proc/$$/status)
       test $rss -ge 1000000 && {  #ok 1 go
          # kill $pidCmd                  #kill le script
          mail -s "alerte" moncompte@hotmail.fr <<<"$rss"  #ici mon mail
          exit
       }
    done
    J'ai mis quelques commentaires si tu peux m’éclairer juste pour mieux comprendre, surtout au niveau du random ça représente un check tous les combien? L'envoi du mail indiquera les secondes? Ce script est a enregistrer avec quelle extension, emplacement?

    Je vais tester ça ensuite merci et je vous tiens au courant.

  15. #15
    Rédacteur

    Avatar de ok.Idriss
    Homme Profil pro
    IS Consultant
    Inscrit en
    Février 2009
    Messages
    5 220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : IS Consultant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2009
    Messages : 5 220
    Points : 19 452
    Points
    19 452
    Par défaut
    Bonsoir.

    Pas d'espaces dans une affectation de variable.
    Sinon l'extension des fichiers n'est pas quelque chose d'indispensable sous Linux, habituellement on met .sh comme extension mais tu pourrais tout aussi bien ne pas lui mettre, ça fonctionnerait sans problème.

    L'extension n'a d'importance que pour certains logiciels manipulant des fichiers mais pas pour l'OS en lui même contrairement à Windows.

    Pour l'emplacement c'est pareil : ou tu veux.

    Cordialement,
    Idriss

  16. #16
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 550
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 550
    Points : 19 383
    Points
    19 383
    Par défaut
    • Citation Envoyé par maloy
      pour mieux comprendre, surtout au niveau du random ça représente un check tous les combien?
      Citation Envoyé par maloy
      check toutes les 1ou 2-3 secondes
    • Citation Envoyé par maloy
      L'envoi du mail indiquera les secondes?
      non
    • Ce script est a enregistrer avec quelle extension, emplacement?
      si ce script ne doit servir qu'à toi, je te suggère de créer un répertoire $HOME/bin, et de l'ajouter à ton PATH.
      s'il doit servir à d'autres personnes, mets-le dans /usr/local/bin (c'est généralement l'emplacement par défaut des programmes compilés)
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  17. #17
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2011
    Messages
    88
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2011
    Messages : 88
    Points : 49
    Points
    49
    Par défaut
    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
    #!/bin/bash
     
    taCommandeAsurveiller=abc #je retire lespace
     
    pidCmd=$(pgrep $taCommandeAsurveiller)
     
    while sleep $((RANDOM%3+1)) 
    do
       read _ rss _ < <(grep VmRSS /proc/$$/status)
       test $rss -ge 1000000 && {  
          # kill $pidCmd                  
          mail -s "alerte" moncompte@hotmail.fr <<<"$rss"
          exit
       }
    done
    while sleep $((RANDOM%3+1)) si je remplace par while sleep $((1)) ça sera 1 seconde?

    Pour l'alerte que ça soit en log-mail je m'en fou, le but c'est surtout que j'ai une arlerte avec la date et heure/minute/seconde.

    Merci

  18. #18
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 550
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 550
    Points : 19 383
    Points
    19 383
    Par défaut
    sleep 1 sera suffisant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $(( <évaluation arithmétique> ))
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mail -s "alerte" moncompte@hotmail.fr <<<"$rss - $(date +%F\ %T)"
    !

    les logs, c'est pour pouvoir vérifier le fonctionnement;
    les mails, sur un système qui n'a pas de serveur de mails ouvert sur l'extérieur, pour les alertes (c'est plus réactif: y a un mail = alerte).
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  19. #19
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2011
    Messages
    88
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2011
    Messages : 88
    Points : 49
    Points
    49
    Par défaut
    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
    #!/bin/bash
     
    taCommandeAsurveiller=abc
     
    pidCmd=$(pgrep $taCommandeAsurveiller)
     
    while sleep 2
    do
       read _ rss _ < <(grep VmRSS /proc/$$/status)
       test $rss -ge 1000000 && {  
          # kill $pidCmd                  
          mail -s "alerte" moncompte@hotmail.fr <<<"$rss - $(date +%F\ %T)"
          exit
       }
    done
    voilà donc au final ça me donne ça, le message me donnera comme message la date et lheure/minute/seconde.

    je test et je vous dis ça.

  20. #20
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2011
    Messages
    88
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2011
    Messages : 88
    Points : 49
    Points
    49
    Par défaut
    après avoir testé j'ai:

    root ~ # sh test.sh
    test.sh: line 9: syntax error near unexpected token `<'
    test.sh: line 9: ` read _ rss _ < <(grep VmRSS /proc/$$/status)'
    root ~ #

Discussions similaires

  1. Réponses: 8
    Dernier message: 16/03/2007, 16h43
  2. Réponses: 1
    Dernier message: 12/03/2007, 19h56
  3. Script qui s'exécute deux fois ?
    Par ben53 dans le forum Langage
    Réponses: 1
    Dernier message: 29/01/2007, 15h56
  4. Script qui s'exécute 2 fois!
    Par franculo_caoulene dans le forum Général JavaScript
    Réponses: 13
    Dernier message: 07/12/2005, 09h48

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