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 :

Lancer un script/commande sur plusieurs serveurs distants


Sujet :

Shell et commandes GNU

  1. #1
    Membre du Club
    Femme Profil pro
    Inscrit en
    Septembre 2011
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2011
    Messages : 54
    Points : 63
    Points
    63
    Par défaut Lancer un script/commande sur plusieurs serveurs distants
    Dans mon home de la machine « cairo », j’ai un fichier contenant une liste de serveurs « servers ». Sur chaque serveur, il y a plusieurs instances apache qui doivent être arrêtées et redémarrés si elles étaient déjà démarrées. Sur chacun des serveurs, je souhaite lancer à partir de « cairo » un script d’arrêt/démarrage « stopstart.sh » pour faire cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #!/bin/sh
     
    for VAR in /prod/*/apache2
     
    sudo $VAR/bin/apachectl stop
     
    sudo $VAR/bin/apachectl start
     
    done
    1) Comment ajouter cette contrainte : pour chaque instance vérifier d’abord si elle est bien démarrée (avec par exemple le code retour de : « ps - eaf | grep –v | grep httpd <nom_instance> »), et si et seulement si c’est le cas, alors exécuter le stop/start, sinon ne rien faire...

    2) Comment récupérer les erreurs formatées par machine et par instance ainsi que la sortie standard de chaque machine (notamment le code retour indiquant si l’instance est démarrée ou non et le résultat des sudo stop/start ) :
    a) sur l'écran de « cairo »?
    b) dans un fichier sur « cairo » : /home/user, le fichier est bien formaté pour bien comprendre qu’il s’agit de tel serveur et de telle instance…?

  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 737
    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 737
    Points : 31 065
    Points
    31 065
    Billets dans le blog
    1
    Par défaut
    Ouais, bonjour, s'il vous plait, merci, au revoir c'est quand tu veux. Et apparemment on voit bien que tu veux pas.

    Citation Envoyé par bras39 Voir le message
    1) Comment ajouter cette contrainte : pour chaque instance vérifier d’abord si elle est bien démarrée (avec par exemple le code retour de : « ps - eaf | grep –v | grep httpd <nom_instance> »), et si et seulement si c’est le cas, alors exécuter le stop/start, sinon ne rien faire...
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if ps - eaf  | grep –v | grep httpd <nom_instance>
    then
        sudo $VAR/bin/apachectl stop
        sudo $VAR/bin/apachectl start
    fi

    Citation Envoyé par bras39 Voir le message
    2) Comment récupérer les erreurs formatées par machine et par instance ainsi que la sortie standard de chaque machine (notamment le code retour indiquant si l’instance est démarrée ou non et le résultat des sudo stop/start ) :
    a) sur l'écran de « cairo »?
    b) dans un fichier sur « cairo » : /home/user, le fichier est bien formaté pour bien comprendre qu’il s’agit de tel serveur et de telle instance…?
    Avec des redirections

  3. #3
    Membre du Club
    Femme Profil pro
    Inscrit en
    Septembre 2011
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2011
    Messages : 54
    Points : 63
    Points
    63
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Ouais, bonjour, s'il vous plait, merci, au revoir c'est quand tu veux. Et apparemment on voit bien que tu veux pas.
    T'as raison, méaculpa...

    Bonsoir Sve@r, Bonsoir tous les autres;

    Ca ne marche pas, car je ne suis pas sûr de ce qu'il faut faire avec <nom_instance> !! Voici mon code qui ne marche pas ni par les instances démarées ni pour les redirections (Merci de ne pas rigolez de moi )

    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    for VAR in /prod/*/apache2
     
    do
    if ps - eaf  | grep –v | grep httpd $VAR
     
    then
        sudo $VAR/bin/apachectl stop 1> logs 2>&1
        sudo $VAR/bin/apachectl start  1> logs 2>&1
    fi
     
    echo "l'instance $VAR est actuellement démarrée sur $HOSTNAME, elle a donc être arrêtée et démarrée" >> logs 
     
    done


    Citation Envoyé par Sve@r Voir le message
    Avec des redirections
    Les rédirections que j'ai mis plus au dans mon code ne donne rien ni sur l'écran "cairo" ni dans mon fichier "logs", comment faire ?!

    D'avance Merci de votre aide

  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 737
    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 737
    Points : 31 065
    Points
    31 065
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par bras39 Voir le message
    T'as raison, méaculpa...

    Bonsoir Sve@r, Bonsoir tous les autres;

    Ca ne marche pas, car je ne suis pas sûr de ce qu'il faut faire avec <nom_instance> !! Voici mon code qui ne marche pas ni par les instances démarées ni pour les redirections (Merci de ne pas rigolez de moi )

    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    for VAR in /prod/*/apache2
     
    do
    if ps - eaf  | grep –v | grep httpd $VAR
     
    then
        sudo $VAR/bin/apachectl stop 1> logs 2>&1
        sudo $VAR/bin/apachectl start  1> logs 2>&1
    fi
     
    echo "l'instance $VAR est actuellement démarrée sur $HOSTNAME, elle a donc être arrêtée et démarrée" >> logs 
     
    done
    Je ne comprends pas trop. Tu parles "d'instance" mais tel que ton script est écrit, $VAR contient un nom de dossier !!!

    Citation Envoyé par bras39 Voir le message
    Les rédirections que j'ai mis plus au dans mon code ne donne rien ni sur l'écran "cairo" ni dans mon fichier "logs", comment faire ?!
    Ben oui !!! La seconde redirection écrase la première !!!
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    (
        sudo $VAR/bin/apachectl stop
        sudo $VAR/bin/apachectl start
    ) 1>logs 2>&1

  5. #5
    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,

    Je doute que ton script dépasse le stade du "if"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ps - eaf  | grep –v | grep httpd $VAR
    ps - eaf => ça ça ne fait rien, sinon une erreur (ps -eaf sans espace entre le tiret et les options)

    grep –v => là il faut une option après le "-v" Que veux-tu exclure de la recherche ?

  6. #6
    Membre du Club
    Femme Profil pro
    Inscrit en
    Septembre 2011
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2011
    Messages : 54
    Points : 63
    Points
    63
    Par défaut
    Bonsoir à tout le monde,

    Citation Envoyé par Sve@r Voir le message
    Je ne comprends pas trop. Tu parles "d'instance" mais tel que ton script est écrit, $VAR contient un nom de dossier !!!
    Il y a même pire! Quand je fais un : echo "il y a $VAR actives", j'ai comme retour : /prod/{WEBLO, APA, SPHER, etc.}/apache2/... où WEBLO, APA, etc. sont les noms de mes instances que je retrouve sous la forme suivante avec la commande "ps -eaf |grep httpd" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     ../../bin/httpd -f  /prod/{WEBLO, APA, SPHER, etc.}/apache2/conf/httpd.conf -k start
    Or mon souhait c'est de ne me retrouver qu'avec le seul nom de l'instance et non pas tout son chemin absolu !!

    zip31 : bien vu ! MAis je pense que chacun avait corrigé lors de la frappe (y compris moi-même )



    Citation Envoyé par Sve@r Voir le message
    Ben oui !!! La seconde redirection écrase la première !!!
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    (
        sudo $VAR/bin/apachectl stop
        sudo $VAR/bin/apachectl start
    ) 1>logs 2>&1
    Et comment dans ce cas, je peux ajouter mon fameux commentaire : echo "l'instance $VAR est actuellement démarrée sur $HOSTNAME, elle a donc être arrêtée et démarrée" ?

    Quid de l'affichage sur l'écran de ma machine locale ?

    Merci

  7. #7
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 737
    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 737
    Points : 31 065
    Points
    31 065
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par bras39 Voir le message
    Et comment dans ce cas, je peux ajouter mon fameux commentaire : echo "l'instance $VAR est actuellement démarrée sur $HOSTNAME, elle a donc être arrêtée et démarrée" ?
    Tu fais vraiment pas d'effort pour analyser le code donné afin de comprendre son principe afin de l'adapter à ton besoin !!!
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    (
        echo "l'instance $VAR est actuellement démarrée sur $HOSTNAME, elle a donc être arrêtée et démarrée"
        sudo $VAR/bin/apachectl stop
        sudo $VAR/bin/apachectl start
    ) 1>logs 2>&1

    Citation Envoyé par bras39 Voir le message
    Quid de l'affichage sur l'écran de ma machine locale ?
    Ah ben une redirection a pour but de rediriger l'affichage vers autre chose que l'écran. Donc redirection => plus rien sur l'écran !!!

    Si tu veux garder l'écran, alors faut utiliser la commande tee qui écrit ce qu'on lui donne à l'écran tout en le dédoublant aussi vers un fichier...
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    (
        echo "l'instance $VAR est actuellement démarrée sur $HOSTNAME, elle a donc être arrêtée et démarrée"
        sudo $VAR/bin/apachectl stop
        sudo $VAR/bin/apachectl start
    ) |tee logs

  8. #8
    Membre du Club
    Femme Profil pro
    Inscrit en
    Septembre 2011
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2011
    Messages : 54
    Points : 63
    Points
    63
    Par défaut
    Bonjour,

    Mon script ci-dessous ne marche toujours pas ! Que ce soit avec "tee" ou avec les redirections, le fichier "logs" ne s'est pas céé pas et rien ne s'affiche sur mon écran local (etmon "echo" de la boucle n'affiche rien non plus, même pas la valeur de £HOSTNAME !).
    Je doute de la validité de tester sur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     ps -eaf  | grep -v grep | grep httpd | grep $VAR
    (je l'avais donné moi-même initialement à titre d'exemple uniquement, sans aucune garantie de ma part qu'il s'agit du bon test à faire ou pas... Je ais juste que le ps -eaf |grep httpd me donne normalement les instances qui sont démarrées sur une machine donnée).
    En plus, j'ai testé avec ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for VAR in $(pgrep httpd)
    mais cela non plus n'a pas marché!

    Si quelqu'un aurait la gentillesse de m'aider, voici une description précise de mon problème :

    J'ai plusieurs instances Apache qui se trouvent sur diférrents serveurs, mais qui se trouvent toutes dans :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    /prod/{INST1, INS2, INS3, etc.)/
    Le chemin vers le binaire qui teste la configuration d'une instance donnée et qui stop et start chacune des instances quelque soit le serveur, est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     /prod/{INS1, INS2, INS3, etc.}/apache2/bin/{configtest, stop, start}
    Le script que je souhaite avoir doit faire ceci :
    1° Chercher toute instance Apache démarrée, et si et seulement si elle est démarrée, alors lui faire : un "configtest", un "stop" et enfin un start". Pour toute éventuelle instances non-démarrées on ne fait rien...

    2° Pour les instances démarrées, afficher le nom de l'instance démarée, suivi du hostname de son serveur sur l'écran distant de ma machine où le script a été lancé, et enfin écrire dans un fichier logs ces mêmes informations ainsi que toutes les erreurs de succès ou d'echec pour chaque instance et serveur (Le nom d'une instance peut-être le même, mais sur deux machines différentes !).


    J'espère que j'étais plus clair dans la définition de mon problème...

    En vous remaerciant d'avance


    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
    #!/bin/sh
     
    for VAR in /prod/*/apache2/bin
     
    do
            if ps -eaf  | grep -v grep | grep httpd | grep $VAR
     
                    then
                    (
                            echo "l'instance $VAR est actuellement démarrée sur $HOSTNAME, elle a donc être arrêtée et démarrée"
                            sudo $VAR/apachectl configtest
                             sudo $VAR/apachectl stop
                             sudo $VAR/apachectl start
                    )|tee logs
                     # 1>logs 2>&1
     
            fi
     
    done

  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,

    Il te faut procéder par étape...

    Qu'affiche sur ton écran :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #!/bin/sh
     
    for VAR in /prod/*/apache2/bin
     
    do
       if ps -eaf | egrep "${VAR}\s"
       then echo "l'instance $VAR est actuellement démarrée sur $HOSTNAME"
       fi
    done

  10. #10
    Membre du Club
    Femme Profil pro
    Inscrit en
    Septembre 2011
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2011
    Messages : 54
    Points : 63
    Points
    63
    Par défaut
    Citation Envoyé par zipe31 Voir le message
    Salut,

    Il te faut procéder par étape...

    Qu'affiche sur ton écran :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #!/bin/sh
     
    for VAR in /prod/*/apache2/bin
     
    do
       if ps -eaf | egrep "${VAR}\s"
       then echo "l'instance $VAR est actuellement démarrée sur $HOSTNAME"
       fi
    done
    Ce script n'affiche rien sur l'écran !

    Et j'ai l'impression que le problème vient de "if ps -eaf | egrep "${VAR}\s",

    car au prompt j'obtiens bien le bon résultat de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    bash-3.00$ VAR=CLAY;echo "l'instance $VAR est actuellement démarrée sur $HOSTNAME"

  11. #11
    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
    Ok.

    Que donne dans un shell :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    VAR="/prod/INST1/apache2/bin"
    ps -ef | egrep "${VAR}\s"
    En remplaçant bien évidemment "INST" par un répertoire existant

  12. #12
    Membre du Club
    Femme Profil pro
    Inscrit en
    Septembre 2011
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2011
    Messages : 54
    Points : 63
    Points
    63
    Par défaut
    Citation Envoyé par zipe31 Voir le message
    Ok.

    Que donne dans un shell :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    VAR="/prod/INST1/apache2/bin"
    ps -ef | egrep "${VAR}\s"
    En remplaçant bien évidemment "INST" par un répertoire existant
    Ca n'affiche rien !
    Par contre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    VAR="/prod/INST1/apache2/bin"; ps -ef | egrep $VAR
    me retourne ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    webuser 17980 17837   0 19:46:10 pts/6       0:00  grep /prod/CLAY/apache2/bin
    Où CLAY est l'une de mes instances.

  13. #13
    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
    Ok, donc on va essayer :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #!/bin/sh
     
    for VAR in /prod/*/apache2/bin
     
    do
       if ps -ef | egrep ${VAR}\
       then echo "l'instance $VAR est actuellement démarrée sur $HOSTNAME"
       fi
    done

  14. #14
    Membre du Club
    Femme Profil pro
    Inscrit en
    Septembre 2011
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2011
    Messages : 54
    Points : 63
    Points
    63
    Par défaut
    Citation Envoyé par zipe31 Voir le message
    Ok, donc on va essayer :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #!/bin/sh
     
    for VAR in /prod/*/apache2/bin
     
    do
       if ps -ef | egrep ${VAR}\
       then echo "l'instance $VAR est actuellement démarrée sur $HOSTNAME"
       fi
    done
    Maintenant, j'ai une erreur dans le "fi" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    line 6: syntax error near unexpected token `fi'
    N.B.: je suis sur un Solaris ! Et je viens de voir que ça marche lorsque j'ai testé sans line "\" du VAR}\!

  15. #15
    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
    Oups j'ai oublié d'enlrever un "\" dans le copier/coller


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #!/bin/sh
     
    for VAR in /prod/*/apache2/bin
     
    do
       if ps -ef | egrep ${VAR}
       then echo "l'instance $VAR est actuellement démarrée sur $HOSTNAME"
       fi
    done

  16. #16
    Membre du Club
    Femme Profil pro
    Inscrit en
    Septembre 2011
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2011
    Messages : 54
    Points : 63
    Points
    63
    Par défaut
    Citation Envoyé par zipe31 Voir le message
    Oups j'ai oublié d'enlrever un "\" dans le copier/coller


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #!/bin/sh
     
    for VAR in /prod/*/apache2/bin
     
    do
       if ps -ef | egrep ${VAR}
       then echo "l'instance $VAR est actuellement démarrée sur $HOSTNAME"
       fi
    done
    Ce script marche maintenant, mais il faut noter qu'il me retourne le chemin absolu de chaque instance, du genre : /prod/CLAY/apache2/bin, alors que je m'attendais à n'avoir que "CLAY" au niveau affichage...

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

Discussions similaires

  1. [PowerShell] Inventorier les KB sur plusieurs serveurs distants
    Par bouba_69 dans le forum Scripts/Batch
    Réponses: 4
    Dernier message: 15/02/2012, 15h16
  2. lancer un script shell sur un serveur distant avec php
    Par MSM_007 dans le forum Langage
    Réponses: 1
    Dernier message: 03/05/2010, 12h32
  3. lancer une application java sur un serveur distant en exécutant un script shell
    Par M_Dandouna dans le forum Shell et commandes GNU
    Réponses: 1
    Dernier message: 12/06/2008, 15h40
  4. Réponses: 0
    Dernier message: 27/11/2007, 15h37
  5. Lancer une page HTML sur un serveur distant
    Par Larion dans le forum VBScript
    Réponses: 5
    Dernier message: 14/08/2006, 09h34

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