mdijoux25 Posté(e) le 13 février 2015 Posté(e) le 13 février 2015 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. 0 Citer
CoolRaoul Posté(e) le 13 février 2015 Posté(e) le 13 février 2015 (modifié) 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é le 13 février 2015 par CoolRaoul 0 Citer
mdijoux25 Posté(e) le 13 février 2015 Auteur Posté(e) le 13 février 2015 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" 0 Citer
mdijoux25 Posté(e) le 15 février 2015 Auteur Posté(e) le 15 février 2015 (modifié) 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é le 15 février 2015 par mdijoux25 0 Citer
CoolRaoul Posté(e) le 15 février 2015 Posté(e) le 15 février 2015 (modifié) 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é le 15 février 2015 par CoolRaoul 0 Citer
mdijoux25 Posté(e) le 15 février 2015 Auteur Posté(e) le 15 février 2015 en effet je m'en excuse. enfaite le problème vient du lancement du script python dans le script ASH car j'ai mis le script pyhton dans le crontab et il se lance correctement. c'est dans l'appel du script ASH ou rien ne se passe 0 Citer
mdijoux25 Posté(e) le 23 février 2015 Auteur Posté(e) le 23 février 2015 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é. 0 Citer
CoolRaoul Posté(e) le 23 février 2015 Posté(e) le 23 février 2015 (modifié) 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é le 23 février 2015 par CoolRaoul 0 Citer
mdijoux25 Posté(e) le 23 février 2015 Auteur Posté(e) le 23 février 2015 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" 0 Citer
CoolRaoul Posté(e) le 23 février 2015 Posté(e) le 23 février 2015 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à. 0 Citer
mdijoux25 Posté(e) le 23 février 2015 Auteur Posté(e) le 23 février 2015 (modifié) 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é le 23 février 2015 par mdijoux25 0 Citer
CoolRaoul Posté(e) le 23 février 2015 Posté(e) le 23 février 2015 (modifié) **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é le 23 février 2015 par CoolRaoul 0 Citer
CoolRaoul Posté(e) le 23 février 2015 Posté(e) le 23 février 2015 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" 0 Citer
Messages recommandés
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.