Aller au contenu

Script De Monitoring Ne Se Lance Pas


Messages recommandés

Bonjour,

alors voici mon problème j'ai un script sh qui se lance manuellement sans problème, cependant dès que je le programme dans le crontab ou le planificateur de tâches rien ne se passe.

j'ai suivi différents sujet et apporté des modifications mais rien n'y fait.

je souhaite donc savoir quel est la syntaxe pour l'exécution des scripts depuis le planificateur de tâches.

Lien vers le commentaire
Partager sur d’autres sites

Probème connu et souvent rencontré: Il faut savoir qu'un script lancé par la crontab ou le planificateur de taches (ce qui revient au même) se retrouve avec l'environnement par défaut, car ni "/etc/profile" ni "/root/.profile" ne sont exécutés au préalable dans ce cas. Ce qui peut expliquer un comportement différent qu'en interactif ("manuellement")

Plus précisément il est impératif si on désire avoir accès à des commandes situées en dehors des dossiers systèmes par défaut, d'au moins y définir le PATH et éventuellement autres variables d'environnement potentiellement requises

En outre, pour ne pas être aveugle, et disposer d'une trace d'exécution je préconise que le début du script ressemble à ceci:

#! /bin/ash
[ -t 0 ] || exec >/tmp/monjob.log 2>&1 # "monjob" ou autre, sans importance

Si le script ne semble pas fonctionner en cron, le contenu de "/tmp/monjob.log" devrait sans aucun doute donner une indication sur la cause. La condition "[ -t 0 ]" aura pour effet que la redirection error/output vers le log ne soit effective qu'en mode détaché.

Modifié par CoolRaoul
Lien vers le commentaire
Partager sur d’autres sites

le fichier de log est vide malheureusement :/

voici mon script

#!/bin/ash
[ -t 0 ] || exec >/tmp/monjob.log 2>&1
cd /usr/syno/bin/check/
HOST="nom du synology"
/usr/bin/python /usr/syno/bin/check/send_nrdp.py -u http://ipduseerveur/nrdp/ -t token --hostname="$HOST" --service="service" -S 0 --output="test de syno"
Lien vers le commentaire
Partager sur d’autres sites

le problème semble venir de l'appel du script python dans mon script shell.

lorsque j'exécute les deux scripts séparément dans le crontab tout se passe correctement.

cependant dans le script shell, le script python ne se lance pas :/

du coup j'ai apporté des modifications à mon script :

#!/bin/sh
echo "debut du script">>/tmp/out.txt 2>&1
HOST="synology"
echo "host = $HOST" >>/tmp/out.txt 2>&1
PATH=/bin:/usr/bin>>/tmp/out.txt 2>&1
cd /volume1/script/
python=$(which python)
senddata=`$python send_nrdp.py -u http://ipduserver/nrdp/ -t token--hostname="$HOST" --service="test" -S 0 --output="test" >>/tmp/out.txt 2>&1
echo "fin du script"`>>/tmp/out.txt 2>&1
echo $senddata>>/tmp/out.txt 2>&1
Modifié par mdijoux25
Lien vers le commentaire
Partager sur d’autres sites

Elle est bien biscornue la derniere version du script...

D'abord, pourquoi s'emm*** à ajouter ">>/tmp/out.txt 2>&1" derriere *chaque* ligne alors qu'avec mon approche avec un "exec" en début,la redirection est effectuée une bonne fois pour toute?

Ensuite, la variable "senddata" ne risque pas de contenir quoi que ce soit dans la mesure ou ta redirection est à l’intérieur des backquotes.

Enfin, de toutes façon, c'est syntaxiquement incorrect car je ne vois pas la backquote fermante correspondant à celle suivant "sendata="

Repars plutot de la version de script de ton post #3 en y ajoutant "set -x" en début, et regarde ce que contient "/tmp/monjob.log" après exécution.

Modifié par CoolRaoul
Lien vers le commentaire
Partager sur d’autres sites

comment puis-je savoir qu'ou vient le souci car lorsque je verifie dans le fichier de log il est vide ?

c'est comme si le script python n'était même pas appelé.

Pas possible qu'il soit vide si, comme je l'ai conseillé, tu as bien ajouté la commande "set -x" en début du script..

(si tu pouvais à l'occasion nous montrer les 4 premières du lignes du script, histoire de se faire une idée).

Modifié par CoolRaoul
Lien vers le commentaire
Partager sur d’autres sites

en ajoutant le "Set -x" j'ai le fichier de log que voici :

+ cd /usr/syno/bin/check/
+ HOST=DS1513+
+ /usr/bin/python send_nrdp.py -u http://ipduseerveur/nrdp/ -t token --hostname=DS1513+ --service=Service -S 0 --output=test de syno

 

et voici mon script :

#!/bin/ash
set -x
[ -t 0 ] || exec >/tmp/monjob.log 2>&1
cd /usr/syno/bin/check/
HOST="DS1513+"
/usr/bin/python send_nrdp.py -u http://ipduseerveur/nrdp/ -t token --hostname="$HOST" --service="service" -S 0 --output="test de syno"
 
Lien vers le commentaire
Partager sur d’autres sites

La 3eme ligne du log montre bien que le script python "send_nrdp.py" est bien invoqué

Qu'il n'ait aucune action apparente est donc un problème lié à ce dernier et pas au shell (doit y avoir une différence de contexte cron VS interactif qui en change le comportement)

Faudrait mieux connaitre ce que fait ce send_nrdp.py et comment en rendre l'exécution plus "verbeuse"

Problème: python, je suis croyant mais pas (encore) pratiquant (suis de la vielle école: perl). Faudra attendre qu'un spécialiste passe par là.

Lien vers le commentaire
Partager sur d’autres sites

le script python permet l'envois d'un XML avec les différentes informations passées en paramètres à un serveur Nagios.

il s'agit d'une méthode de contrôle passif.

le problème est bien la, tout se passe correctement en manuel mais pas avec crontab.

ce script existe aussi en version BASH et en perl cependant je ne sais pas comment les faires fonctionner sur un Nas Synology.

voici le script python :

#!/usr/bin/env python
import optparse, sys, urllib, cgi
from xml.dom.minidom  import parseString
class send_nrdp:
    options = [
        optparse.make_option('-u', '--url', action="store",
            dest="url", help="** REQUIRED ** The URL used to access the remote NRDP agent."),
        optparse.make_option('-t', '--token', action="store",
            dest="token", help="** REQUIRED ** The authentication token used to access the remote NRDP agent."),
        optparse.make_option('-H', '--hostname', action="store",
            dest="hostname", help="The name of the host associated with the passive host/service check result."),
        optparse.make_option('-s', '--service', action="store",
            dest="service", help="For service checks, the name of the service associated with the passive check result."),
        optparse.make_option('-S', '--state', action="store",
            dest="state", help="An integer indicating the current state of the host or service."),
        optparse.make_option('-o', '--output', action="store",
            dest="output", help="Text output to be sent as the passive check result.  Newlines should be encoded with encoded newlines (n)."),
        optparse.make_option('-d', '--delim', action="store",
            dest="delim", help="With only the required parameters send_nrdp.py is capable of processing data piped to it either from a file or other process.  By default, we use t as the delimiter however this may be specified with the -d option data should be in the following formats one entry per line."),
        optparse.make_option('-c', '--checktype', action="store",
            dest="checktype", help="1 for passive 0 for active")
    ]

    def run(self):
        parser = optparse.OptionParser(option_list=self.options)
        (options, args) = parser.parse_args()

        if not options.url:
            parser.error('You must specify a url.')
        if not options.token:
            parser.error('You must specify a token.')
        try:
            self.setup(options, args)
            sys.exit()
        except Exception, e:
            sys.exit(e)
    def getText(self, nodelist):
        rc = []
        for node in nodelist:
            if node.nodeType == node.TEXT_NODE:
                rc.append(node.data)
        return ''.join(rc)

    def post_data(self, url, token, xml):
        params = urllib.urlencode({'token': token.strip(),'cmd': 'submitcheck', 'XMLDATA': xml});
        opener = urllib.FancyURLopener()
        try:
            f = opener.open(url, params)
            result = parseString(f.read())
        except Exception, e:
            print "Cannot connect to url."
            # TODO add directory option
            sys.exit(e)
        if self.getText(result.getElementsByTagName("status")[0].childNodes) == "0":
            sys.exit()
        else:
            print "ERROR - NRDP Returned: "+self.getText(result.getElementsByTagName("message")[0].childNodes)
            sys.exit(1)

    def setup(self, options, args):
        if not options.delim:
            options.delim = "t"
        if not options.checktype:
            options.checktype = "1"
        xml="<?xml version='1.0'?>n<checkresults>n";
        
        # it is possible this may not work on windows systems...
        if not sys.stdin.isatty():
            for line in sys.stdin.readlines():
                parts = line.split(options.delim)
                if len(parts) == 4:
                    xml += "<checkresult type='service' checktype='"+options.checktype+"'>"
                    xml += "<hostname>"+cgi.escape(parts[0],True)+"</hostname>"
                    xml += "<servicename>"+cgi.escape(parts[1],True)+"</servicename>"
                    xml += "<state>"+parts[2]+"</state>"
                    xml += "<output>"+cgi.escape(parts[3],True)+"</output>"
                    xml += "</checkresult>"
                if len(parts) == 3:
                    xml += "<checkresult type='host' checktype='"+options.checktype+"'>"
                    xml += "<hostname>"+cgi.escape(parts[0],True)+"</hostname>"
                    xml += "<state>"+parts[1]+"</state>"
                    xml += "<output>"+cgi.escape(parts[2],True)+"</output>"
                    xml += "</checkresult>"
                    
        # TODO add file option
        #elif options.file:
        #    xml += READ THE FILE
        else:        
            if options.hostname and options.state:
                if options.service:
                    xml += "<checkresult type='service' checktype='"+options.checktype+"'>"
                    xml += "<hostname>"+cgi.escape(options.hostname,True)+"</hostname>"
                    xml += "<servicename>"+cgi.escape(options.service,True)+"</servicename>"
                    xml += "<state>"+options.state+"</state>"
                    xml += "<output>"+cgi.escape(options.output,True)+"</output>"
                    xml += "</checkresult>"
                else:
                    xml += "<checkresult type='host'  checktype='"+options.checktype+"'>"
                    xml += "<hostname>"+cgi.escape(options.hostname,True)+"</hostname>"
                    xml += "<state>"+options.state+"</state>"
                    xml += "<output>"+cgi.escape(options.output,True)+"</output>"
                    xml += "</checkresult>"
                xml += "</checkresults>"
                self.post_data(options.url, options.token, xml)
if __name__ == "__main__":
    send_nrdp().run()     




Modifié par mdijoux25
Lien vers le commentaire
Partager sur d’autres sites

**EDIT** et (sans doute) <HS>

Je vois dans le script un:

cd /usr/syno/bin/check/

qui m’inquiète peu. Il n'y a pas de répertoire "check" dans "/usr/syno/bin" sous DSM.

Mettre des outils perso dans des répertoires systèmes non prévus à cet effet est un peu casse-gueule. Déjà à la moindre update DSM pas trop mineure, ce dossier "check" sera purement et simplement effacé.

Le seul dossier système à peu prés préservé lors des mise à jour de firmware est "/usr/local" (et tout ce qui est en dessous). Mieux vaut travailler là (ou dans un dossier partagé; /volume<n>/...)


voici le script python :

La ça devient du chinois pour mois, attendons un spécialiste

Modifié par CoolRaoul
Lien vers le commentaire
Partager sur d’autres sites

Sans trop connaitre python, la condition "if not sys.stdin.isatty():" montre bien un comportement différent de ce script si l'entrée standard est un terminal (ce qui est le cas en interactif) ou pas (cas du cron)

Et justement; dans le cas ou stdin n'est pas un terminal il boucle sur un "for line in sys.stdin.readlines():" qui va se terminer immédiatement puisque l'entrée est "/dev/null"

Lien vers le commentaire
Partager sur d’autres sites

Rejoindre la conversation

Vous pouvez publier maintenant et vous inscrire plus tard. Si vous avez un compte, connectez-vous maintenant pour publier avec votre compte.

Invité
Répondre à ce sujet…

×   Collé en tant que texte enrichi.   Coller en tant que texte brut à la place

  Seulement 75 émoticônes maximum sont autorisées.

×   Votre lien a été automatiquement intégré.   Afficher plutôt comme un lien

×   Votre contenu précédent a été rétabli.   Vider l’éditeur

×   Vous ne pouvez pas directement coller des images. Envoyez-les depuis votre ordinateur ou insérez-les depuis une URL.

×
×
  • Créer...

Information importante

Nous avons placé des cookies sur votre appareil pour aider à améliorer ce site. Vous pouvez choisir d’ajuster vos paramètres de cookie, sinon nous supposerons que vous êtes d’accord pour continuer.