2016-07-13 13 views
1

Ich habe diesen Python-Skript-Dienste wie MySQL und Apache zu überprüfen und wenn einige von ihnen sind nach unten, dann geht es wieder los:Was ist falsch an meinem Python-Skript und Cron-Job?

import subprocess 
import smtplib 

_process = ['mysql', 'apache2'] 
for _proc in _process: 
    p = subprocess.Popen(["service", _proc, "status"], stdout=subprocess.PIPE) 
    output, err = p.communicate() 
    print "*** check service "+_proc+" ***\n" 
    if 'Active: active (running)' in output: 
     print _proc+" is working!" 
    else: 
     print "Ouchh!! "+_proc+" again is down." 
     output = subprocess.Popen(["service", _proc, "start"]) 
     print "*** The service "+_proc+" was restarted ***\n", output 

     print "*** sending email ***\n" 
     server = smtplib.SMTP('smtp.gmail.com', 587) 
     server.ehlo() 
     server.starttls() 
     _from = "[email protected]" 
     _to = "[email protected]" 
     _cc = ["[email protected]"] 
     _pass = "xxxxxx" 
     server.login(_from, _pass) 
     msg = "\r\n".join([ 
      "From: "+_from, 
      "To: "+_to, 
      "CC: "+",".join(_cc), 
      "Subject: Ouchh!! "+_proc+" again is down.", 
      "", 
      "Again " + _proc + " is down. The service was restarted!!" 
     ]) 
     server.sendmail(_from, _to, msg) 
     server.quit() 
     print "*** email send ***\n" 

Es funktioniert in meiner Konsole gut, wenn ich den folgenden Befehl ausführen:

python /home/check-services.py

Alles in Ordnung aussieht. Ich versuche, den Cron-Job im Webmin-Server einzurichten, und er sollte jede Minute ausgeführt werden, tut es aber nicht. Dies ist das Cron-Protokoll:

(root) CMD (python /home/check-services.py) jede Minute, wie wir bereits konfiguriert wurde.

Ich sehe nichts abnormal, aber es funktioniert immer noch nicht. Ich schätze all deine Hilfe.

Python-Version 2.7.

EDIT: ich die E-Mail in/var/E-Mail/root und es zeigt dies gerade gesehen:

Traceback (most recent call last): 
    File "/home/check-services.py", line 77, in <module> 
    p = subprocess.Popen(["service", _proc, "status"], stdout=subprocess.PIPE) 
    File "/usr/lib/python2.7/subprocess.py", line 710, in __init__ 
    errread, errwrite) 
    File "/usr/lib/python2.7/subprocess.py", line 1335, in _execute_child 
    raise child_exception 
OSError: [Errno 2] No such file or directory 
+2

Gerade durch die Syntaxfärbung in diesem Beitrag geht, sieht es aus wie Sie haben, ein zusätzliches Anführungszeichen nach '" ist wieder runter. "' – Kevin

+2

hast du '/ usr/bin/python/home/check-services.py' versucht. Die meiste Zeit für Cron zu arbeiten, müssen Sie absolute Pfad geben. –

+0

Vermissen Sie #!/Usr/bin/python in der ersten Zeile des Skripts? In der Crontab, nennst du es mit dem Python Pre-Fix oder nur mit /opt/script/myscript.py? – AK47

Antwort

3

Das Problem ist, dass service nicht in eines der Verzeichnisse in dem $ PATH aufgeführt ist der Cron-Prozess.

Es gibt viele Lösungen. Eine Lösung besteht darin, den vollständigen Pfad zu service in Ihrem .Popen() Aufruf anzugeben. Auf meinem Computer ist das /usr/sbin/service.

Try this:

p = subprocess.Popen(
    ["/usr/sbin/service", _proc, "status"], stdout=subprocess.PIPE) 

Eine andere Lösung ist eine andere $ PATH in Ihrer crontab angeben:

* * * * * PATH=/bin:/usr/bin:/sbin:/usr/sbin /usr/bin/python /home/check-services.py 
+0

Vielen Dank @Rob. Diese Lösung funktioniert für mich. Das Problem war der PATH zur cron-Umgebung. Ich habe den PATH im Cron eingerichtet und es funktioniert !! –