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 :

Tester si un service est démarré


Sujet :

Shell et commandes GNU

  1. #1
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Avril 2013
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations forums :
    Inscription : Avril 2013
    Messages : 26
    Points : 11
    Points
    11
    Par défaut Tester si un service est démarré
    Bonjour,

    Dans ma quête d'apprendre à écrire des scripts bash, je viens vous en présenter un nouveau et en profiter pour poser une question. Aujourd'hui, j'ai fait un script pour configurer mon NAS avec autofs.

    A la fin du script, je relance les services autofs et rpcbind, je pense idéalement avant faudrait que je fasse des tests pour savoir si ils sont déjà démarrés. Mais comment faire?

    Voici le script:
    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
    #!/bin/bash
    ADRESSESERVEUR=nas.ip
    CREDENTIALS=/root/.auto_nas
    DOSSIERNAS=/media/nas
    FICHIERMASTER=/etc/auto.master
    FICHIERNAS=/etc/auto.nas
     
    if [ "$EUID" -ne 0 ] ; then
    	echo "Il vous faut les droits administrateurs!"
    	exit
    fi
     
     
    apt-get -y install autofs nfs-common rpcbind
     
    echo "Nom d'utilisateur:"
    read USERNAME
     
    echo "Mot de passe:"
    read PASSWORD
     
    mkdir -p "$DOSSIERNAS"
     
    cat > "$FICHIERMASTER" << EOF
    +dir:/etc/auto.master.d
    $DOSSIERNAS $FICHIERNAS --ghost,--timeout=300
    EOF
     
    cat > "$CREDENTIALS" << EOF
    username=$USERNAME
    password=$PASSWORD
    EOF
     
    cat > "$FICHIERNAS" << EOF
    backup -fstype=nfs,rw,intr,credentials=$CREDENTIALS $ADRESSESERVEUR:/Backup
    document -fstype=nfs,rw,intr,credentials=$CREDENTIALS $ADRESSESERVEUR:/Documents
    videos -fstype=nfs,rw,intr,credentials=$CREDENTIALS $ADRESSESERVEUR:/Multimedia
    download -fstype=nfs,rw,intr,credentials=$CREDENTIALS $ADRESSESERVEUR:/Download
    EOF
     
    service autofs restart
    service rpcbind restart
    Sinon avez-vous des critiques générales ou amélioration à faire sur mon script?

    Merci et salutation

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

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

    demande à service le status de chacun.

    NB: les noms de variables entièrement en majuscules sont réservés aux variables d'environnement.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Avril 2013
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations forums :
    Inscription : Avril 2013
    Messages : 26
    Points : 11
    Points
    11
    Par défaut
    Merci pour la réponse!

    Je pensais que les majuscule était pour toutes les variables. Donc c'est que les variables d'environnements alors je peux le faire simplement comme ça?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    adresseServeur=nas.ip
    credentials=/root/.auto_nas
    dossierNAS=/media/nas
    fichierMaster=/etc/auto.master
    fichierNAS=/etc/auto.nas
    Oui je sais utiliser la commande service mais c'est pour le traitement après. Je pensais cherché avec grep:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    service apache2 status | grep "inactive (dead)"
    Mais avec le retour, je ne sais pas trop comment le traiter avec un if?

    Salutation merci

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 549
    Points : 19 376
    Points
    19 376
    Par défaut
    si tu n'as qu'une seule action à effectuer, un ET (&&) ou un OU (||) logique feras l'affaire.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    service <tonService> status || service <tonService> restart
    parce que a priori tu sais que le service est installé !
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  5. #5
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Avril 2013
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations forums :
    Inscription : Avril 2013
    Messages : 26
    Points : 11
    Points
    11
    Par défaut
    Bonjour,

    Merci pour la réponse. Si je comprends bien l'exemple, il redémarre le service si son statut est désactivé? Si le statut est activé, il ne fait rien? Donc c'est pas mieux de démarrer au lieu redémarrer?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    service <service> status || service <service> start
    Car moi à la fin de mon script, j'ai absolument besoin de le redémarrer pour prendre en compte ma configuration. Techniquement, ma première solution fonctionne mais ce qu'il me gêne de dans c'est que si le statut est désactivé, il le redémarre à la place de le démarrer. Je sais la nuance est faible mais je ne connais pas suffisamment pour savoir si cela crée un problème. Je voudrais savoir si c'est possible de faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SI service == activé ALORS
        redémarrer service
    AUTREMENT
        démarre service
    FIN
    Es-ce que je pinaille un peu trop?

    Merci

  6. #6
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Avril 2013
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations forums :
    Inscription : Avril 2013
    Messages : 26
    Points : 11
    Points
    11
    Par défaut
    Bonjour,

    Désoler de revenir à la charge mais personnes a d'idée de comment je pourrais faire??

    Merci salutation

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 549
    Points : 19 376
    Points
    19 376
    Par défaut
    enregistre le "status" (le retour de la commande) dans une variable, puis teste sa valeur :
    Code BASH : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    declare -A Services Status #initialisation *indispensable* de tableaux associatifs
    for srvc in "${Services[@]}"
    do
       service "$srvc" status
       Status["$srvc"]=$?
    done
    # autres choses à faire...
    for srvc in "${Status[@]}"
    do
       # retour > 0 (pas démarré)  ET service start          OU service restart
       ((${Status["$srvc"]}))      && service "$srvc" start  || service "$srvc" restart
    done
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  8. #8
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Avril 2013
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations forums :
    Inscription : Avril 2013
    Messages : 26
    Points : 11
    Points
    11
    Par défaut
    Merci pour cette réponse,

    Je vais être direct, je n'ai pas compris grand chose! J'ai découvert que declare -A permet de définir une variable comme tableau, juste? Les traitement dans la boucle for sont très obscure pour moi. J'en ai ressorti que quand je fais un service "$srvc" status", j'ai un code de sortie plus grand que 0 si il n'est pas démarré. Voilà le point que je ne connais pas encore bien les codes de sorties. Il faut que je pense plus à les exploiter. Oui je suis encore débutant en script bash. Donc avec mon code de sortie, je vais le tester afin de définir mon action sur le service.

    J'ai transformer le script comme ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    service "$srvc" status
     
    if [ $? > 0 ] ; then
    	service "$srvc" start
    else
    	service "$srvc" restart
    fi
    Ma solution fonctionne mais est-elle propre? Si ça ne te gène pas pourrais-tu mieux d'expliquer ta solution?

    Merci et salutation

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 549
    Points : 19 376
    Points
    19 376
    Par défaut
    Attention ! > est un opérateur de comparaison lexicale : il compare des chaînes.
    les opérateurs de comparaison arithmétique sont :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    -lt # lesser than
    -le # lesser or equal
    -eq # equal
    -ne # not equal
    -ge # greater or equal
    -gt # greater than
    je reprends mon code, car il y a quelques erreurs :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    declare -A Status #initialisation *indispensable* d'un tableau associatif
    Services=( autofs rpcbind ) # initialisation d'un tableau indexé avec la liste des services à traîter
    for srvc in "${Services[@]}" # boucle sur les éléments du tableau indexé
    do
       service "$srvc" status # ça, tu connais ;)
       Status["$srvc"]=$? #assignation de la valeur du retour de la commande précédente au /status/ de chaque service
    done
    # autres choses à faire...
    for srvc in "${Services[@]}"
    do
       # retour > 0 (pas démarré)  ET service start          OU service restart
       ((${Status["$srvc"]}))      && service "$srvc" start  || service "$srvc" restart
    done
    dans une évaluation arithmétique (entre parenthèses doubles) 0 est une erreur (le code de retour est supérieur à zéro : ((0)); echo $? retourne 1).
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  10. #10
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Avril 2013
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations forums :
    Inscription : Avril 2013
    Messages : 26
    Points : 11
    Points
    11
    Par défaut
    Merci beaucoup pour se complément d'information. J'ai mieux compris ton bout de code maintenant! Ta solution est beaucoup plus élégante que la mienne. Il me reste cependant encore une zone d'ombre, c'est cette fameuse ligne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ((${Status["$srvc"]})) && service "$srvc" start  || service "$srvc" restart
    Je comprends ce que tu m'as expliqué pour la partie ((${Status["$srvc"]})) mais je ne comprends pas bien comment elle peut interagir avec la suite? Si le service est actif, il sort un code d'erreur à 0 donc ((0)) donne un code d'erreur à 1 jusque ici tous va bien mais c'est la suite que je comprends pas.

    Merci pour toutes ces informations! Dès demain je serais absent jusqu'à la semaine prochaine donc je reviendrais lundi pour donner un retour.

    Salutation

  11. #11
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Avril 2013
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations forums :
    Inscription : Avril 2013
    Messages : 26
    Points : 11
    Points
    11
    Par défaut
    Pour finir, je comprends! J'ai trouvé l'information dans l'Introduction à la programmation shell en Bash d'Eric Sanchis (lien FTP) au chapitre 7.

    Merci encore pour tous

  12. #12
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 101
    Points : 5 849
    Points
    5 849
    Par défaut
    Citation Envoyé par xekkos Voir le message
    Pour finir, je comprends! J'ai trouvé l'information dans l'Introduction à la programmation shell en Bash d'Eric Sanchis (lien FTP) au chapitre 7.
    Hmmm... Ce lien apparaît est présent (avec une indirection) dans la signature de N_BaH, mais, dans celle-ci, le lien "la FAQ" et le lien "les cours" sont affichés avec la même police que le reste.

    je ne sais pas si c'est dû à une configuration particulière de mon navigateur, mais sinon je trouve dommage que leur statut de lien ne soit pas visible, par exemple avec un soulignement.

    EDIT: Oops! Il va être temps de changer de lunettes! Effectivement, la couleur est légèrement différente.
    Sur un portable 15 pouces avec une Resolution: 2880 x 1800 Retina, les caractères font 1mm de haut => il va être temps de changer de résolution! (encore une bonne résolution pour le nouvel an...)

  13. #13
    Membre habitué Avatar de RaphaelG
    Homme Profil pro
    Amateur
    Inscrit en
    Juin 2016
    Messages
    94
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Amateur

    Informations forums :
    Inscription : Juin 2016
    Messages : 94
    Points : 183
    Points
    183
    Par défaut
    Moi, j'ai FireFox 45.3 (la version livré avec Jessie, la Debian stable) et les liens ne sont certes pas soulignés mais apparaissent avec une couleur différente du reste de la signature de N_BaH.
    Perso, je trouve cela suffisamment explicite.
    IMHO, you should RTFM ASAP. IHTH.

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 549
    Points : 19 376
    Points
    19 376
    Par défaut
    ah, vous aussi !

    je tiens compte de vos remarque, et ai modifié ma signature pour mettre plus en évidence les liens.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  15. #15
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 101
    Points : 5 849
    Points
    5 849
    Par défaut
    Excellentissime!

    Là, on peut vraiment pas les louper!

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

Discussions similaires

  1. tester si le serveur MS SQL Server est démarré
    Par Chatbour dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 10/08/2020, 21h21
  2. [XL-2010] Comment tester si un TCD est connecté à un cube Analysis Services SQL Server
    Par fmarguin dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 12/08/2016, 11h34
  3. Réponses: 2
    Dernier message: 02/08/2010, 10h59
  4. Tester si un champ est NULL
    Par titititi007 dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 19/06/2003, 10h17
  5. tester si une date est valide
    Par Andry dans le forum Langage
    Réponses: 5
    Dernier message: 17/09/2002, 11h54

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