Forum Programmation.shell Script de controle et de redémarrage de service

Posté par .
Tags : aucun
1
29
sept.
2011

Bonjour à tous,

j'ai fais un script qui contrôle le status de mon service, et si mon service est arrêter, il le relance, le problème c'est qu'il ne fonctionne pas, et je ne trouve pas le problème

!/bin/bash

Module name

PS=$1

status()
{
/etc/init.d/${PS} status
}

start()
{
/etc/init.d/${PS} start
}

status
if [$? -ne 0]; then
logguer "Processus ${PS} not started"
start
fi

Si quelqu'un aurait une idée,

Merci d'avance,
Franck

  • # case $1 in

    Posté par . Évalué à -1.

    Bonjour,

    Il me semble qu´il manque la un case.
    Tu définis des fonctions qui ne seront jamais appellées.

    Voici le premier lien sur lequel je suis tombé comprenant un exemple :

    http://www.novell.com/coolsolutions/feature/15380.html

    • [^] # Re: case $1 in

      Posté par . Évalué à 1.

      Merci pour le lien, mais je débute sous linux et je ne comprend pas trop

  • # [ est une commande

    Posté par . Évalué à 3.

    "ça ne fonctionne pas", c'est un peu juste. Prend l'habitude de décrire plus précisément ce qui ne marche pas, les éventuels messages affichés par ton script, etc.

    sinon, là, si tu as copié/collé ton script tel quel, il faut que tu rajoutes quelques espaces pour bien séparer les différents éléments du test.
    essaie aussi d'indenter ton code, ça le rend plus lisible.

    if [$? -ne 0]; then
    logguer "Processus ${PS} not started"
    start
    fi
    
    

    devient

    if [ $? -ne 0 ]; then
      logguer "Processus ${PS} not started"
      start
    fi
    
    
    • [^] # Re: [ est une commande

      Posté par . Évalué à 1.

      Merci gaaaaaAab une nouvelle fois, je vais essayer de faire de mon mieux.
      En faite quand je dis qu'il ne fonctionne pas, il fonctionne mais pas de la façon dont je voudrais.

      Quand je lance mon script si mon service passé en paramètre est démarré, il me répond:

      "${PS} (mon_service) is running"

      Mais si il est éteint, il me répond:

      "${PS} (mon_service) is not running"

      ...et il s'arrête

      Normalement, si il le voit "down", il est censé faire un start de celui-ci, mais il ne le fais pas.

      • [^] # Re: [ est une commande

        Posté par . Évalué à 3.

        c'est ton script de service dont tu parlais là : http://linuxfr.org/forums/programmationshell/posts/contr%C3%B4le-de-lutilisateur-dans-un-shell-de-service qui t'affiche ça ?

        Vérifie que ton script de démarrage de service renvoie bien quelque chose différent de 0 sur la commande status quand ton service est arrété, sinon, $? vaut toujours 0, et tu ne passes jamais dans le start.

        • [^] # Re: [ est une commande

          Posté par . Évalué à 1.

          Nan, en fait je veux faire watchdog (pour le mettre dans le crontab de mon utilisateur) qui vérifie justement mon service en lançant le script de service que j'ai créé hier (compliqué!!)

          • [^] # Re: [ est une commande

            Posté par . Évalué à 2.

            je pense avoir déjà fait des trucs plus complexes que ça ;) il me semble que j'ai compris.
            ce que je dis, c'est pour que ton script de watchdog (que tu es en train d'écrire) effectue une action en fonction de l'état du service, il faut que ton script de service dans /etc/init.d/ton_service status renvoie des valeurs différentes selon que le service est démarré ou pas.

            donc, pour reformuler ma question, quand ton service est arrété, est-ce que /etc/init.d/ton_service renvoie bien une valeur différente de 0 ?

            • [^] # Re: [ est une commande

              Posté par . Évalué à 1.

              :), c'est compliqué mais pour moi!!

              Pour répondre à ta question, oui si le script est arrête la valeur renvoyée est différente de 0.

              Je n'arrive pas dans watchdog à récupérer la valeur de la commande /etc/init.d/mon_service status pour qu'en fonction de cette valeur, je relance ou non le service

              • [^] # Re: [ est une commande

                Posté par . Évalué à 2.

                :), c'est compliqué mais pour moi!!

                ça viendra :)

                bizarre, à la lecture, il n'y a rien qui me saute aux yeux.

                Si tu es en bash, tu peux ajouter, vers le début de ton script:
                set -x
                bash passe en mode debug et affiche le déroulement du script.

                attention aussi au piège classique, cron démarre les jobs avec /bin/sh
                si tu veux utiliser un autre shell, la première ligne du script doit être le chemin vers l'interpréteur. Par exemple, pour bash :

                #!/bin/bash
                
                

                juste pour savoir, tu essaies déjà de mettre ton script en cron ou tu le testes à la main pour l'instant ?

                • [^] # Re: [ est une commande

                  Posté par . Évalué à 1.

                  Merci de ta réponse, je test mon script à la main
                  voilà l'erreur que j'ai quand je l'éxécute:

                  watchdog.sh: line 17: [: missing `]'

                  La ligne 17 correspond à celle du if

                  • [^] # Re: [ est une commande

                    Posté par . Évalué à 2.

                    tu as du zappé un des espaces dont je parlais

                    • [^] # Re: [ est une commande

                      Posté par . Évalué à 0.

                      Ok merci, je pense que le problème vient de mon service qui ne retourne pas 0 (je ne suis plus trop sur de mon code du coup!!)

                      Source function library.
                      . /etc/init.d/functions

                      case $1 in
                      start)
                      su - mvas -c /appi/"appi.sh start"
                      exit 0
                      ;;
                      stop)
                      su - mvas -c /appi/"appi.sh stop"
                      exit 1
                      ;;
                      restart)
                      su - mvas -c /appi/"appi.sh restart"
                      ;;
                      status)
                      su - mvas -c /appi/"appi.sh status"
                      ;;
                      esac
                      exit $?

  • # Petite remarque

    Posté par . Évalué à 1.

    Si quelqu'un aurait avait une idée

    Désolé mais ça pique les yeux.

    Je pense pas que ce soit le problème mais tu as écrit

    !/bin/bash
    
    

    alors que c'est

    !#/bin/bash
    
    

    Et sinon, que vient faire

    Module name

    dans la choucroute ?

    Désolé de pas pouvoir aider plus. Je suis surpris qu'une /etc/init.d/truc status ne renvoie pas 0 quelque soit l'état du service. Que le service soit arrêté n'est pas une erreur dans le script. Il faut peut-être que tu parses la sortie (exemple : s'il y a la chaîne "not started" alors on redémarre le service)

    • [^] # Re: Petite remarque

      Posté par . Évalué à 1.

      Je suis surpris qu'une /etc/init.d/truc status ne renvoie pas 0

      Et c'est tous les jours comme ça... J'ai encore écrit trop vite, visiblement les scripts renvoient bien un code > 0 quand le status est "not running"

      En tous cas j'ai regardé celui de atd.

  • # Résolu

    Posté par . Évalué à 1.

    Merci à tous pour vos réponses,

    j'ai résolu mon problème, c'était bien par rapport à la valeur de sortie que me renvoyer mon service quand il était éteint, il était effectivement à 0.
    Donc mon watchdog ne détectait pas d'anomalie !! :)

Suivre le flux des commentaires

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n'en sommes pas responsables.