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 :

Création de variable d'environnement à la volée


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2009
    Messages
    122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2009
    Messages : 122
    Par défaut Création de variable d'environnement à la volée
    Bonjour tout le monde,

    Voila j'ai un petit script pour qui vérifie l’existence de demons et en fonction du status, j'exporte une variable que je voudrais récupérer par un autre programme.

    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
     
    SERVICE='java'
    SERVICE2='frontalbox frontaladmin frontalvisu server-control-message activemq'
     
    DATE=$(date +%Y/%m/%d-%H:%M:%S)
     
    for serv_name in $SERVICE2 ; do
    	if ps ax | grep -v grep | grep $SERVICE | grep $serv_name > /dev/null
    	then
    		echo "$serv_name service running, everything is fine"
    		if [ "$serv_name" = "server-control-message" ]
    		then
    			serv_name='server_control_message'
    		fi
    		export $serv_name='ok'
    	else
    		if [ "$serv_name" = "server-control-message" ]
    		then
    			serv_name='server_control_message'
    		fi
    		export $serv_name='nok'
        	        echo "$serv_name is not running! $DATE" | mail -s "$serv_name down" root
    	fi
    	echo "$serv_name"
    done
    le petit if au milieu de la boucle est la car on ne peux pas avoir de tiret dans les noms de variable d'environnment.
    Le problème avec ce script est que le echo à la fin m'affiche le nom de la variable $serv_name au lien de sa valeur...

    Quelqu'un aurait il une idée ?

    Merci d'avance

  2. #2
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 358
    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 358
    Par défaut
    Bonjour,

    Retire les $ sur le nom de ta variable dans les ligne export:
    on fait:
    pas
    Si cela ne corrige pas tout, on y verra plus clair...

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 664
    Par défaut
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    declare $serv_name='ok'
    , car il est bien question de déclarer une variable.

    quelques petites choses :
    • ps -C "$serv_name", ou pgrep "$serv_name" plutôt que la chaîne de greps.
    • un tableau pour une liste plutôt qu'une variable
    • les noms des variables d'un script, pour éviter des collisions avec les variables d'environnement, doivent ne pas être tout en majuscules.
    • puisque le if est le même, il serait plus judicieux de le placer avant le test d'"existence" du "démon".


    et n'oublie pas de mettre un shebang bash.
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  4. #4
    Membre très actif
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2009
    Messages
    122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2009
    Messages : 122
    Par défaut
    Merci disedorgue, ca m'affiche bien la valeur.


    Pour le pgrep j'avais vu cette commande, le problème c'est que le nom de la commande est java et je veux le nom du jar derrière, c'est pour ca que je l'ai fais comme ca et avec ps -C je n'ai pas le nom du jar dans la sortie de la commande.

    Sinon pour le declare, je vois ce que cela apporte, mais je ne vois pas l'intéret puisque dansle man il est marqué :
    When used in a function, declare makes each name local, as with the local command.
    donc ma variable est lié au script, une fois fini, elle n'existe plus... et moi je veux qu'elle vive même après le script...
    Je suis clair ?

  5. #5
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 358
    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 358
    Par défaut
    Pas tout compris de ce que tu voulais faire par rapport à ton script.
    J'ai rectifié mon post précédent, car je pensais que N_BaH était plus dans le vrai dans ce que tu voulais faire.

    Dans ton script, tu utilises la même variable pour tout.
    les if au milieu ne servent strictement à rien si tu as retirer les $ sur les lignes export.

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 664
    Par défaut
    ma variable est lié au script, une fois fini, elle n'existe plus
    de toutes façons, les variables d'un script n'existent que dans ce script, elles ne peuvent pas affecter le processus parent; à moins de l'y sourcer.

    dansle man il est marqué :
    When used in a function, declare makes each name local, as with the local command.
    ce n'est pas le cas ici.

    si tu veux afficher, par exemple :, tu dois effectivement utiliser des noms de variables différents, pour le service et pour l'état.

    ou alors, avec une indirection :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ service=Service_01
    $ declare $service=ok
    $ echo "$service = ${!service}"
    Service_01 = ok
    sinon, il faut connaître le nom de la variable :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $ echo "Service_01 = ${Service_01}"
    Service_01 = ok
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  7. #7
    Membre très actif
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2009
    Messages
    122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2009
    Messages : 122
    Par défaut
    Ok je pense comprendre,

    Alors le pourquoi du comment de mon script :

    j'ai un JMS qui tourne avec activemq, ainsi que plusieurs "module" java (lancer en tant que service) indépendants les uns des autres (et qui communique entre eux via JMS) pour recevoir et traités les messages.
    D'un autre coté il y a une appli web (php-stomp) par laquelle des utilisateurs peuvent effectuer des actions et ces actions sont répercuter via JMS sur les modules java et des équipements électriques.

    Le but de mon script qui sera exécuté toutes les 5 minutes est de tester les services java, et de mettre leur état dans un variable d'environnement qui sera lu par l'appli php et en fonction de l'état des services j’empêche les modifications dans les ihm. (j'ai essayer d'autres méthodes et pour moi celle ci est le meilleur compromis entre performance et conso de ressource)

    Concernant la portée des variables, j'ai oublié de préciser qu'elles sont instancier dans mon .bashrc, mais la modification de la valeur ne dure que le temps du script.

    donc si j'ai bien compris il faut que je déclare autant de variable que de service à tester, ou alors avec avec le principe d'indirection je peux utiliser les même variable dans une boucle du style :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    for a in $SERVICE2 ; do
        service=$a
        declare $a=OK
    done
    j'ai l'impression que je ne suis pas très clair

    Concernant mon if redondant c'est a cause de la commande export qui ne veux pas de tiret dans le nom de la variable

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

Discussions similaires

  1. Création de variable d'environnement
    Par Vince7-7 dans le forum Windows
    Réponses: 4
    Dernier message: 29/04/2014, 18h31
  2. script de création de variable d'environnement
    Par lastrecrue dans le forum Shell et commandes GNU
    Réponses: 1
    Dernier message: 25/08/2010, 18h02
  3. création d'une variable d'environnement
    Par sam_g dans le forum Langage
    Réponses: 1
    Dernier message: 23/11/2007, 10h24
  4. [BES] Création d'une variable d'environnement
    Par NGI80 dans le forum Autres
    Réponses: 2
    Dernier message: 17/10/2002, 07h31
  5. Réponses: 4
    Dernier message: 18/07/2002, 13h32

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