Cronjob mit Python

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • Hallo zusammen,

    erstmal schön, dass es dieses Forum gibt. :thumbs1:

    ich nutze seit einigen Monaten einen Pi (übrigens tolles Teil^^) mit Rasbmc.
    Zusätzlich läuft darauf noch ein VoIP-Skript (PJSIP), das eine bestimmte Rufnummer anruft und bei Beendigung des Anrufs diesen wieder neu anwählt. Das Skript läuft per screen im Hintergrund. Das ganze funktioniert soweit gut.

    Jetzt zu meinem Problem:
    Nach jedem Reconnect des Routers muss ich mich erst per SSH mit dem Pi verbinden, per screen -x den Prozess aufrufen, das Skript beenden und neustarten. Die Idee war jetzt, einfach einen cronjob einzurichten, der dann das Skript in der Nacht 3 oder 4 Uhr beendet (synchron zum Reconnect des Routers), ein paar Sekunden wartet und danach wieder ausführt.

    Meine Versuche dies über cronjob zu realisieren verliefen bisher leider negativ.

    Ich hoffe ihr könnt mir dabei weiterhelfen. Wahrscheinlich mache ich einfach nur einen Anfängerfehler ;)

  • Generell erstmal vorweg: Wenn du das Script mit dem Zusatz " & " startest wird es in den Hintergrund gelegt und man kann auf screen verzichten ;)
    Also zum Beispiel:

    Code
    /home/pi/script.py &

    Der Reconnect deines Routers wird aber vermutlich nicht immer Nachts sein oder? Wenn mal tagsüber ein Stromausfall wäre oder eine DSL-Störung oder er warum auch immer neu connected, ist der Plan durcheinander...

    Deshalb würde ich lieber überlegen - sofern dein Router bei einer erneuten einwahl eine andere IP kriegt - die PID des Scripts in eine Datei zu schreiben, ein weiteres Script prüft jede Minute ob sich die Internet-IP geändert hat und falls ja würde die PID des Python Scripts beendet werden und das Python Script neu gestartet werden... so oder so ähnlich wäre es denk ich besser :D

    Bezüglich Python und PID kannst du das verwenden: http://stackoverflow.com/questions/7884…ript-is-running oder http://neopatel.blogspot.de/2010/09/python…g-pid-file.html


  • Generell erstmal vorweg: Wenn du das Script mit dem Zusatz " & " startest wird es in den Hintergrund gelegt und man kann auf screen verzichten ;)


    Nur solange er per ssh angemeldet bleibt. Wenn die ssh Session beendet wird wird auch das Script beendet. =(
    Deshalb benutzt der TE screen. Alternativ kann er aber auch nohup benutzen.

  • Die Idee, das Skript praktisch nur bei einem Reconnect neu zu starten, gefällt mir natürlich noch besser. Ich hatte das nur für umständlich gehalten und deswegen in weite Ferne gepackt ;)

    Ich habe gerade den Befehl mit & ausprobiert, da lief das Skript nicht mit.. Vielleicht hilft das ja insgesamt bei der Lösung, weil ich den Eindruck hatte, schon mal den Cronjob richtig erstellt zu haben, sodass es bei einem Neustart des Pi angeht und trotzdem liefs nich richtig.


    Über Screen siehts dann so aus, wie es aussehen soll :huh:

    Habt ihr dafür ne Erklärung?

  • Ich seh da jetzt keinen nennenswerten Unterschied :huh:


    Das Problem dabei is aber das da ne Ausgabe kommt - das mag crontab nicht so gerne also müsste man es dann Umlenken, entweder in ein Logfile oder in den Linux typischen Mülleimer /dev/null


    Wie gesagt, ich persönlich würde das so zurecht basteln das ein bash Script sich darum kümmert das python Script auszuführen und wenn sich die Internet-IP ändern auch zu restarten - hier eine leicht abgewandelte Art von meiner vorherigen Idee

    bash Script erstellen, zum Beispiel /home/pi/python_daemon.sh


    Das Script prüft beim ausführen ob $PythonScript in der ProzessListe steht, falls nicht wird das Script ausgeführt. Falls $LOG auf 1 steht wird ein LOGFILE geschrieben, falls das auf 0 steht nicht..

    Falls $PythonScript bereits läuft wird die aktuelle mit der ggf letzten Internet IP vergleichen und wenn die voneinander abweichen wird das Script gekillt und neu gestartet..

    Script in die Benutzer crontab von pi eintragen: crontab -e

    Code
    @reboot	bash /home/pi/python_daemon.sh
    * * * * *	bash /home/pi/python_daemon.sh

    damit wird das Script bei Systemstart ausgeführt (durch @reboot) und jede Minute..

  • Danke an Eure Unterstützung, insbesondere meigrafd :bravo2:
    So richtig funktionieren möchte das Skript noch nicht, ich kann nur nicht soviel damit anfangen, warum der scheinbar die Pfade nicht findet. Habs jetzt erstmal ohne cronjob eben so getetest.

    Code
    pi@raspbmc:~$ bash /home/pi/python_daemon.sh
    /home/pi/python_daemon.sh: line 4: $'\r': command not found
    /home/pi/python_daemon.sh: line 6: $'\r': command not found
    /home/pi/python_daemon.sh: line 8: $'\r': command not found
    /home/pi/python_daemon.sh: line 10: $'\r': command not found
    /home/pi/python_daemon.sh: line 13: $'\r': command not found
    /home/pi/python_daemon.sh: line 22: $'\r': command not found
    /home/pi/python_daemon.sh: line 24: syntax error near unexpected token `$'{\r''
    'home/pi/python_daemon.sh: line 24: `start_PythonScript() {
    pi@raspbmc:~$

  • Wenn man das Script über /etc/rc.local staret läuft es soweit ich weiss weiter, oder nich?


    Jupp, das macht es. In Deinem obigen Kommentar ist das aber nicht so explizit hervorgehoben worden und kann zu Missverständnissen führen.

    Die Methode mit @reboot in der crontab kannte ich noch gar nicht - ist aber gut zu wissen.

  • framp: Das scheinen leider einige nicht zu wissen - hab das auch > hier < thematisiert, da findet man auch einen weiterführenden Link auf Ubuntuwiki wo noch mehr solcher untypischen crontab Einstellungsmöglichkeiten aufgeführt sind


    Code
    pi@raspbmc:~$ bash /home/pi/python_daemon.sh
    /home/pi/python_daemon.sh: line 4: $'\r': command not found
    /home/pi/python_daemon.sh: line 6: $'\r': command not found
    /home/pi/python_daemon.sh: line 8: $'\r': command not found
    /home/pi/python_daemon.sh: line 10: $'\r': command not found
    /home/pi/python_daemon.sh: line 13: $'\r': command not found
    /home/pi/python_daemon.sh: line 22: $'\r': command not found
    /home/pi/python_daemon.sh: line 24: syntax error near unexpected token `$'{\r''
    'home/pi/python_daemon.sh: line 24: `start_PythonScript() {
    pi@raspbmc:~$

    Das liegt offensichtlich daran das du das Script unter Windows mit zb notepad oder sogar Wordpad erstellt hast?

    Windows verwendet andere Zeilenumbruch Zeichen die Linux aber nicht versteht

    Also wenn dann bitte, entweder einen Linux Kompatiblen Editor unter Windows verwenden wie zB notepad++ , Proton oder UltraEdit ... Oder direkt auf Linux einen Editor verwenden wie zB nano , vi oder joe .... Letzteres würde ich dir empfehlen, also nano /home/pi/python_daemon.sh , dann hier den Text markieren, rechtsklick und Kopieren und dann in PuTTY die Rechte Maustaste, oder die Tastenkombination SHIFT+EINFG , zum Einfügen drücken ... Speichern+Beenden und fertig

  • Der Ansatz war schon mal richtig, danke :) Hatte zwar Notepad++ unter Windows genommen, aber daran lag es zumindest. Per Nano als Datei gespeichert geht es zumindest weiter.

    Jetzt startet das Skript, allerdings wird der gewünschte Anruf nicht ausgeführt. :s

    Habe ich wieder etwas falsch gemacht?^^

  • Führ mal folgendes aus um zu sehen was das Script macht:

    Code
    bash -x /home/pi/python_daemon.sh

    /EDIT:

    ich seh aber grade auch das ich einen kleinen fehler gemacht hab... Ändern mal die Zeile

    Code
    if [ -n "$(ps aux | grep -v grep | grep $PythonScript)" ]; then

    in:

    Code
    if [ -z "$(ps aux | grep -v grep | grep $PythonScript)" ]; then


    /EDIT2: Hier eine Version des Scripts mit mehr Ausgaben (das andere hat keine Ausgaben)

  • So, du editierst offensichtlich gerne ;) Habe ich zunächst nicht gesehen.

    Bash -x /home/pi/python_daemon.sh (das neue Skript mit mehr Details) gibt folgendes Infos aus:

    Und wenn ich diesen dann per bash ausführe, passiert das:

    Code
    pi@raspbmc:~$ bash /home/pi/python_daemon.sh
    /home/pi/voip/call2.py seems not running ..
    Starting /home/pi/voip/call2.py ..
    pi@raspbmc:~$

    Muss call2.py Ausführungsrechte (+x) haben?

    Danke nochmal für deine Mühen :)


  • So, du editierst offensichtlich gerne ;) Habe ich zunächst nicht gesehen.

    Ja, sorry - bin ein wenig perfektionist (typisch deutsch eben) :D

    Bash -x /home/pi/python_daemon.sh (das neue Skript mit mehr Details) gibt folgendes Infos aus:

    Hm, das Script müsste dann eigentlich laufen, zumindest setzt er ja den Befehl " python /home/pi/voip/call2.py " ab, nur werden halt dessen Ausgaben in die Logdatei /tmp/log.python_daemon.sh umgeleitet - kannste da mal reingucken?

    Allerdings scheint der RaspberryPI nicht online zu sein bzw kann er anscheint google.de nicht anpingen... Führ mal bitte auf der Konsole folgendes aus:

    Code
    ping -c1 google.de

    Muss call2.py Ausführungsrechte (+x) haben?

    Nein da ja das Script an den Interpreter übergeben wird, also: python /home/pi/voip/call2.py

  • Da hapert es... Die nächste Zeile erscheint, wenn ich das Skript per Screen ausführe.

    Code
    Call with sip:00@fritz.box is EARLY last code = 183 (Session Progress)
  • " Object is busy "

    Läuft das Script vielleicht schon? Poste mal bitte die Ausgabe von:

    Code
    ps aux | grep -v grep | grep call2.py

    Oder halt sicherstellen das kein screen läuft mit dem Script


    /EDIT: noch eine Anpassung des Scripts und zwar 2 Zeilen mit:

    Code
    [ "$(ping -c1 "$OnlinePing" | grep -c "seq")" -eq 1 ]

    ändern in:

    Code
    [ "$(ping -c1 "$OnlinePing" | grep -c "1 received")" -eq 1 ]

    fertig geändertes script (v0.3)

  • Jetzt habe ich deine fertige Version (0.3) benutzt und er führt offensichtlich Prüfung der IP schon mal korrekt durch.

    Allerdings wird das VoiP Skript dahinter immer noch nicht gestartet?!

    Noch ne Idee? :)

  • Es wird schon gestartet, nur funktioniert es nicht - oder?

    Wie gesagt, 2x darf das Python Script nicht laufen das stört sich sonst, also auch wirklich sicherstellen das KEIN screen damit an is - mach alle screen teile wirklich zu! also nicht nur raus gehen sondern wirklich beenden

    Code
    killall -9 screen
    killall -9 SCREEN

    Ansonsten führ das Script vllt mal als root aus also mit sudo davor

  • Ich habe sogar extra gerade zwischendurch schon mehrfach rebootet, um sicherzustellen, dass screen nicht im Hintergrund mitläuft. Davor wurden die Sessions immer mit STRG+D beendet.

    Mit sudo erkennt er die alte und die neue IP. Ich verstehe nur nicht, warum das Skript call2.py über ps a nicht auffindbar ist. Kann man zur Not Screen hier mit einbinden, weil das Skript damit offensichtlich läuft? Aber das würde wohl nur vom eigentlichen Problem ablenken...

    Code
    pi@raspbmc:~$ sudo bash /home/pi/python_daemon_neu.sh
    /home/pi/voip/call2.py seems not running ..
    Starting /home/pi/voip/call2.py ..
    Getting IPs ..
    CURRENTIP: 92.225.xxx.xxx ... LASTIP: 92.225.xxx.xxx


    :helpnew:

  • LASTIP erkennt er nun weil die beim letzten ausführen gespeichert wurde ;)

    Naja vielleicht hab ich auch noch ein Denkfehler und das Prüfen ob das Script bereits läuft müsste anstatt

    Code
    # check if PythonScript runs
    if [ -z "$(ps aux | grep -v grep | grep $PythonScript)" ]; then


    so aussehen:

    Code
    # check if PythonScript runs
    if [ -z "$(ps aux | grep -v grep | grep $(basename $PythonScript))" ]; then


    Ansonsten müsste man das Script ein bischen umschreiben dass es die PID speichert und dann halt prüft ob die PID läuft bzw diese killt usw....

  • Ich verstehe.
    Die Änderung, die du beschreibst, hattest du übrigens schon im Skript 0.3 bereits umgesetzt ;)

    Ich weiß nicht, ob das hilft. Aber wenn ich versuche das Skript (call2.py) mit dem Zusatz & zu starten, funktioniert es auch nicht. Bin leider noch nicht so weit in der Materie drin, um zu wissen, ob das einen Zusammenhang hat.

    Danke und viele Grüße

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!