Script per Cronjob starten

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
bengoshi
User
Beiträge: 9
Registriert: Freitag 27. Januar 2017, 07:23

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
nezzcarth
User
Beiträge: 1634
Registriert: Samstag 16. April 2011, 12:47

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.?
Zuletzt geändert von nezzcarth am Samstag 4. März 2017, 10:53, insgesamt 1-mal geändert.
bengoshi
User
Beiträge: 9
Registriert: Freitag 27. Januar 2017, 07:23

Es sendet WhatsApp-Nachrichten. Und beim beschriebenen Versuch über die bash gingen die raus, beim Cronjob tut sich nix.
Sirius3
User
Beiträge: 17748
Registriert: Sonntag 21. Oktober 2012, 17:20

@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?
bengoshi
User
Beiträge: 9
Registriert: Freitag 27. Januar 2017, 07:23

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.
Benutzeravatar
Dirki
User
Beiträge: 69
Registriert: Donnerstag 23. Juni 2016, 16:11

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.
nezzcarth
User
Beiträge: 1634
Registriert: Samstag 16. April 2011, 12:47

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.
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

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
bengoshi
User
Beiträge: 9
Registriert: Freitag 27. Januar 2017, 07:23

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
BlackJack

@bengoshi: Ich würde sowohl die Standardausgabe als auch die Standardfehlerausgabe umleiten.
bengoshi
User
Beiträge: 9
Registriert: Freitag 27. Januar 2017, 07:23

Macht er das mit &> nicht?
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?
bengoshi
User
Beiträge: 9
Registriert: Freitag 27. Januar 2017, 07:23

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.
Sirius3
User
Beiträge: 17748
Registriert: Sonntag 21. Oktober 2012, 17:20

@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])
Antworten