Seite 1 von 1

Script per Cronjob starten

Verfasst: Samstag 4. März 2017, 10:30
von bengoshi
Heiho,

ich hoffe ich bin hier damit richtig..
Ich versuche ein Python-Script per Cronjob zu starten und es will einfach nichts tun. In Cron habe ich eingetragen:

0 6 * * * /usr/bin/python3 /home/bengoshi/.bin/bibeltext/bibeltext.py

Ich habe den Teil "/usr/bin/python3 /home/bengoshi/.bin/bibeltext/bibeltext.py" mal so in die bash kopiert und dann tut das Script seinen Dienst. Über den Cronjob aber nicht. Im Syslog wird nur angezeigt

Mar 4 08:20:01 37056 /USR/SBIN/CRON[29255]: (bengoshi) CMD (/usr/bin/python3 /home/bengoshi/.bin/bibeltext/bibeltext.py)

(Die Uhrzeit weicht ab, da ich es mit mehreren Zeiten probierte).

Hat jemand eine Idee, woran es liegen könnte?

Danke und beste Grüße

bengoshi

Re: Script per Cronjob starten

Verfasst: Samstag 4. März 2017, 10:47
von nezzcarth
bengoshi hat geschrieben: Ich habe den Teil "/usr/bin/python3 /home/bengoshi/.bin/bibeltext/bibeltext.py" mal so in die bash kopiert und dann tut das Script seinen Dienst. Über den Cronjob aber nicht.
Woran würdest du denn merken, dass das Skript erfolgreich gelaufen ist? Produziert es irgendwelche Ausgaben, schreibt es in Dateien, etc.?

Re: Script per Cronjob starten

Verfasst: Samstag 4. März 2017, 10:51
von bengoshi
Es sendet WhatsApp-Nachrichten. Und beim beschriebenen Versuch über die bash gingen die raus, beim Cronjob tut sich nix.

Re: Script per Cronjob starten

Verfasst: Samstag 4. März 2017, 11:15
von Sirius3
@bengoshi: leite am einfachsten die Ausgabe in eine Datei um, und schau, welche Fehler das Programm ausgibt:
[codebox=bash file=Unbenannt.bsh]
0 6 * * * /usr/bin/python3 /home/bengoshi/.bin/bibeltext/bibeltext.py &>/home/bengoshi/bibeltext.log
[/code]

Warum liegt das Programm in einem .bin Ordner?

Re: Script per Cronjob starten

Verfasst: Samstag 4. März 2017, 11:49
von bengoshi
Weil ich es da reingepackt habe :)

Das ganze lief einige Zeit auf meinem Festrechner und wurde von mir morgens per Hand gestartet. Jetzt will ich das automatisiert von meinem Webserver aus tun. Die Verzeichnisstrukturen etc habe ich übernommen.

Re: Script per Cronjob starten

Verfasst: Samstag 4. März 2017, 14:28
von Dirki
Mal ein Schuss ins Blaue:
Ich würde die Shebang konfigurieren, das das Skript ohne /usr/bin/python ausgeführt werden kann, damit du den Cron-Eintrag ohne Leerzeichen im Befehl erstellen kannst.
Edit:
Evtl noch chmod +x auf die Datei, sollte sie keine Ausführungsrechte haben.

Wenn du das Skript über den Pfad ohne vorangestellten /usr/bin/python starten kannst sollte es auch problemlos als Cron funktionieren.

Re: Script per Cronjob starten

Verfasst: Samstag 4. März 2017, 15:05
von nezzcarth
Dirki hat geschrieben:Mal ein Schuss ins Blaue:
Ich würde die Shebang konfigurieren, das das Skript ohne /usr/bin/python ausgeführt werden kann, damit du den Cron-Eintrag ohne Leerzeichen im Befehl erstellen kannst.
Edit:
Evtl noch chmod +x auf die Datei, sollte sie keine Ausführungsrechte haben.

Wenn du das Skript über den Pfad ohne vorangestellten /usr/bin/python starten kannst sollte es auch problemlos als Cron funktionieren.
Die Angaben von bengoshi deuten meiner Meinung nach darauf hin, dass das Problem nicht bei Cron liegt, sondern beim Skript (das allerdings wohl auch keine Fehlermeldung ausgibt). Entsprechend würde ich Sirius3s Vorschlag, sich die Fehlermeldungen in eine Datei schreiben zu lassen, unterstützen.

EDIT:
@bengoshi: In welchem Verzeichnis hast du die Befehle in der Bash ausgeführt? Das sollte zur Vergleichbarkeit im Home-Verzeichnis der Benutzers, als der der Cronjob ausgeführt wird, geschehen, da das ja als Arbeitsverzeichnis dient.

Re: Script per Cronjob starten

Verfasst: Samstag 4. März 2017, 20:38
von noisefloor
Hallo,

welches System benutzt du? Wenn du eins mit systemd hast, dann starte das Skript über eine systemd Service Unit. Dann loggt systemd für dich zumindest mit, wann und warum das Skript den Dienst verweigert.

Gruß, noisefloor

Re: Script per Cronjob starten

Verfasst: Sonntag 5. März 2017, 20:21
von bengoshi
Vielen Dank für Eure Antworten!
Das Script hat eine Shebang, sprich es startet mit

Code: Alles auswählen

#!/usr/bin/env python3
Ich hatte anfangs auch versucht, „nur“ das Script in den cronjob einzutragen (also ohne /usr/bin/python3 vorher), ging aber auch nicht.

Ich habe die Ausgabe wie oben beschrieben mit &> in eine Datei leiten lassen. Ich hatte es vor dem Test selbst mit ursprünglich mit >> getan. Das Ergebnis ist leider gleich - es wird eine leere Datei angelegt. Das war's. :(

Das Syslog hilft mir jedenfalls auch nicht weiter:

Code: Alles auswählen

Mar  5 19:15:01 37056 /USR/SBIN/CRON[12084]: (bengoshi) CMD (/home/bengoshi/.bin/bibeltext/bibeltest.py &>/home/bengoshi/.bin/bibeltext/bibeltest.log)
Bei dem System handelt es sich um ein Debian 7.11, noch brav ohne systemd. Andere cronjobs verrichten ihre Dienste.

Die Scriptdatei hat als Ausführungsrechte 744, Benutzer und Gruppe sind gleich dem Benutzer des Cronjobs.

Wie gesagt, das Script direkt läuft..

Beste Grüße

bengoshi

Re: Script per Cronjob starten

Verfasst: Sonntag 5. März 2017, 20:49
von BlackJack
@bengoshi: Ich würde sowohl die Standardausgabe als auch die Standardfehlerausgabe umleiten.

Re: Script per Cronjob starten

Verfasst: Montag 6. März 2017, 17:33
von bengoshi
Macht er das mit &> nicht?

Re: Script per Cronjob starten

Verfasst: Montag 6. März 2017, 18:57
von BlackJack
@bengoshi: Gute Frage. Ich mache es immer ”normal” mit einem extra 2>&1. Die Bash versteht das da wohl auch. Aber benutzt ``cron`` die auch? Was macht beispielsweise die ``dash`` damit?

Re: Script per Cronjob starten

Verfasst: Samstag 25. März 2017, 19:14
von bengoshi
Vielen Dank für Eure Hinweise! Mit weiterer Hilfe habe ich jetzt das Problem lösen können. Für andere, die vielleicht auch vor dem Problem mal stehen.. Im Script werden an verschiedenen Stellen Bezüge auf externe Daten. Da habe ich feste Pfade reingenommen.
Bei dem nachfolgenden Aufruf war es allerdings so, dass es nicht /usr/local/bin/yowsup-cli, sondern ohne Pfad:

Code: Alles auswählen

os.system('/usr/bin/python yowsup-cli demos --config /home/bengoshi/.bin/bibeltext/config-bengoshi -M --send ' + user_call_number_str + ' ' +     '"' + bible_text + '"')
Im crontab sah es dann so aus:

Code: Alles auswählen

 */1 * * * * "/home/bengoshi/.bin/bibeltext/testlauf.py" > /home/bengoshi/bengoshi-test.log 2>&1
Dann lief das Script erstmal und es wurden tapfer Fehler geloggt und der Rest konnte angegangen werden.

Re: Script per Cronjob starten

Verfasst: Samstag 25. März 2017, 19:51
von Sirius3
@bengoshi: verwende niemals os.system, und erst recht nicht, wenn Du Daten einfügst, die potentiell nicht unter Deiner Kontrolle sind. Ich weiß nicht, wo oft in der Bibel die Worte stehen: »Und er ging nach $(rm -rf /) und alles war leer.«

Nimm das subprocess-Modul:

Code: Alles auswählen

configfile = "/home/bengoshi/.bin/bibeltext/config-bengoshi"
subprocess.call(["/usr/bin/python", "yowsup-cli", "demos", "--config",  configfile, "-M" ,"--send", str(user_call_number), bible_text])