Précédent   Forum des professionnels en informatique > Systèmes > Linux > Applications > Shell
Shell Vos questions sur l'utilisation des commandes shell
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 08/10/2011, 15h04   #1
Membre du Club
 
Femme
Inscription : septembre 2011
Messages : 54
Détails du profil
Informations personnelles :
Sexe : Femme

Informations forums :
Inscription : septembre 2011
Messages : 54
Points : 52
Points : 52
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 :
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…?
bras39 est déconnecté   Envoyer un message privé Réponse avec citation 11
Vieux 09/10/2011, 17h07   #2
Expert Confirmé Sénior
 
Avatar de Sve@r
 
Homme Frédéric
Ingénieur développement logiciels
Inscription : février 2006
Messages : 3 055
Détails du profil
Informations personnelles :
Nom : Homme Frédéric
Âge : 44
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 : 3 055
Points : 4 934
Points : 4 934
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 :
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
__________________
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Tout ce qu'un individu reçoit sans rien faire pour l'obtenir, un autre individu a dû travailler pour le produire sans en tirer profit.
Tout Pouvoir ne peut distribuer aux uns que ce qu'il a préalablement confisqué à d'autres car on n'accroît pas les biens en les divisant.
Quand la moitié d'un peuple croit qu'il ne sert à rien de faire des efforts car l'autre moitié les fera pour elle, et quand cette dernière moitié se dit qu'il ne sert à rien d'en faire car ils bénéficieront à d'autres, cela s'appelle le déclin et la fin d'une nation.
Dr. Adrian Rogers, 1931
Sve@r est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 09/10/2011, 19h03   #3
Membre du Club
 
Femme
Inscription : septembre 2011
Messages : 54
Détails du profil
Informations personnelles :
Sexe : Femme

Informations forums :
Inscription : septembre 2011
Messages : 54
Points : 52
Points : 52
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 :
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
bras39 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 10/10/2011, 18h36   #4
Expert Confirmé Sénior
 
Avatar de Sve@r
 
Homme Frédéric
Ingénieur développement logiciels
Inscription : février 2006
Messages : 3 055
Détails du profil
Informations personnelles :
Nom : Homme Frédéric
Âge : 44
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 : 3 055
Points : 4 934
Points : 4 934
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 :
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 :
1
2
3
4
(
    sudo $VAR/bin/apachectl stop
    sudo $VAR/bin/apachectl start
) 1>logs 2>&1
__________________
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Tout ce qu'un individu reçoit sans rien faire pour l'obtenir, un autre individu a dû travailler pour le produire sans en tirer profit.
Tout Pouvoir ne peut distribuer aux uns que ce qu'il a préalablement confisqué à d'autres car on n'accroît pas les biens en les divisant.
Quand la moitié d'un peuple croit qu'il ne sert à rien de faire des efforts car l'autre moitié les fera pour elle, et quand cette dernière moitié se dit qu'il ne sert à rien d'en faire car ils bénéficieront à d'autres, cela s'appelle le déclin et la fin d'une nation.
Dr. Adrian Rogers, 1931
Sve@r est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 10/10/2011, 18h44   #5
Expert Confirmé
 
Inscription : janvier 2011
Messages : 970
Détails du profil
Informations personnelles :
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : janvier 2011
Messages : 970
Points : 2 871
Points : 2 871
Salut,

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

Code :
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 ?
__________________
$ man woman
Il n'y a pas de page de manuel pour woman.
zipe31 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 10/10/2011, 20h40   #6
Membre du Club
 
Femme
Inscription : septembre 2011
Messages : 54
Détails du profil
Informations personnelles :
Sexe : Femme

Informations forums :
Inscription : septembre 2011
Messages : 54
Points : 52
Points : 52
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 :
 ../../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 :
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
bras39 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 11/10/2011, 20h21   #7
Expert Confirmé Sénior
 
Avatar de Sve@r
 
Homme Frédéric
Ingénieur développement logiciels
Inscription : février 2006
Messages : 3 055
Détails du profil
Informations personnelles :
Nom : Homme Frédéric
Âge : 44
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 : 3 055
Points : 4 934
Points : 4 934
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 :
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 :
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
__________________
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Tout ce qu'un individu reçoit sans rien faire pour l'obtenir, un autre individu a dû travailler pour le produire sans en tirer profit.
Tout Pouvoir ne peut distribuer aux uns que ce qu'il a préalablement confisqué à d'autres car on n'accroît pas les biens en les divisant.
Quand la moitié d'un peuple croit qu'il ne sert à rien de faire des efforts car l'autre moitié les fera pour elle, et quand cette dernière moitié se dit qu'il ne sert à rien d'en faire car ils bénéficieront à d'autres, cela s'appelle le déclin et la fin d'une nation.
Dr. Adrian Rogers, 1931
Sve@r est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 14/10/2011, 15h47   #8
Membre du Club
 
Femme
Inscription : septembre 2011
Messages : 54
Détails du profil
Informations personnelles :
Sexe : Femme

Informations forums :
Inscription : septembre 2011
Messages : 54
Points : 52
Points : 52
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 :
 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 :
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 :
/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 :
 /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 :
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
bras39 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 14/10/2011, 17h00   #9
Expert Confirmé
 
Inscription : janvier 2011
Messages : 970
Détails du profil
Informations personnelles :
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : janvier 2011
Messages : 970
Points : 2 871
Points : 2 871
Salut,

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

Qu'affiche sur ton écran :

Code :
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
__________________
$ man woman
Il n'y a pas de page de manuel pour woman.
zipe31 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 14/10/2011, 18h42   #10
Membre du Club
 
Femme
Inscription : septembre 2011
Messages : 54
Détails du profil
Informations personnelles :
Sexe : Femme

Informations forums :
Inscription : septembre 2011
Messages : 54
Points : 52
Points : 52
Citation:
Envoyé par zipe31 Voir le message
Salut,

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

Qu'affiche sur ton écran :

Code :
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 :
bash-3.00$ VAR=CLAY;echo "l'instance $VAR est actuellement démarrée sur $HOSTNAME"
bras39 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 14/10/2011, 19h25   #11
Expert Confirmé
 
Inscription : janvier 2011
Messages : 970
Détails du profil
Informations personnelles :
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : janvier 2011
Messages : 970
Points : 2 871
Points : 2 871
Ok.

Que donne dans un shell :

Code :
1
2
VAR="/prod/INST1/apache2/bin"
ps -ef | egrep "${VAR}\s"
En remplaçant bien évidemment "INST" par un répertoire existant
__________________
$ man woman
Il n'y a pas de page de manuel pour woman.
zipe31 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 14/10/2011, 19h44   #12
Membre du Club
 
Femme
Inscription : septembre 2011
Messages : 54
Détails du profil
Informations personnelles :
Sexe : Femme

Informations forums :
Inscription : septembre 2011
Messages : 54
Points : 52
Points : 52
Citation:
Envoyé par zipe31 Voir le message
Ok.

Que donne dans un shell :

Code :
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 :
VAR="/prod/INST1/apache2/bin"; ps -ef | egrep $VAR
me retourne ceci :

Code :
webuser 17980 17837   0 19:46:10 pts/6       0:00  grep /prod/CLAY/apache2/bin
Où CLAY est l'une de mes instances.
bras39 est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 14/10/2011, 19h56   #13
Expert Confirmé
 
Inscription : janvier 2011
Messages : 970
Détails du profil
Informations personnelles :
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : janvier 2011
Messages : 970
Points : 2 871
Points : 2 871
Ok, donc on va essayer :

Code :
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
__________________
$ man woman
Il n'y a pas de page de manuel pour woman.
zipe31 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 14/10/2011, 20h03   #14
Membre du Club
 
Femme
Inscription : septembre 2011
Messages : 54
Détails du profil
Informations personnelles :
Sexe : Femme

Informations forums :
Inscription : septembre 2011
Messages : 54
Points : 52
Points : 52
Citation:
Envoyé par zipe31 Voir le message
Ok, donc on va essayer :

Code :
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 :
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}\!
bras39 est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 14/10/2011, 20h06   #15
Expert Confirmé
 
Inscription : janvier 2011
Messages : 970
Détails du profil
Informations personnelles :
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : janvier 2011
Messages : 970
Points : 2 871
Points : 2 871
Oups j'ai oublié d'enlrever un "\" dans le copier/coller


Code :
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
__________________
$ man woman
Il n'y a pas de page de manuel pour woman.
zipe31 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 14/10/2011, 20h11   #16
Membre du Club
 
Femme
Inscription : septembre 2011
Messages : 54
Détails du profil
Informations personnelles :
Sexe : Femme

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


Code :
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...
bras39 est déconnecté   Envoyer un message privé Réponse avec citation 10
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 19h40.


 
 
 
 
Partenaires

Hébergement Web