Python Script - Crontab

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

    ich habe jetzt ein sehr simples Python script geschrieben das mir den Webbrowser öffnet und eine bestimmte URL aufruft , das funktioniert soweit auch sehr gut .

    Jetzt soll dieses Script per Crontab alle 2 Minuten gestartet werden , daher habe ich in der Konsole

    Zitat

    crontab -e

    eingegeben und den Crontab hinzugefügt.

    Zitat

    */2 * * * * /usr/bin/python /home/pi/script/script.py 2>&1

    Allerdings führt er das Script nicht so aus wie ich es gerne hätte , im cron.log steht dass er das script ganz normal ausführt , aber der browser öffnet sich nicht und die Website wird auch nicht aufgerufen ... :-/ :s

  • Weil ein skript per cron gestartet keine grafische ausgabe (DISPLAY) nutzen kann. Wenn du das von der Konsole/terminal startest, hast du(der user) aber die entsprechende Oberfläche.

    Du könntest es statt dessen mit einer Schleife bauen.

    Code
    while true
    do
    ....
    sleep 2m
    done

    Das musst du dann aber immer starten wenn du als dein user den Pi gestartet hast und eingelogt bist. Frage ist halt was du eigentlich machen willst. ( Nebenbei bemerkt, das Thema hatten wir schon mehrfach )

    --
    man ist das System-Anzeigeprogramm für die Handbuchseiten von Linux.

    Einmal editiert, zuletzt von Lunepi (23. April 2014 um 16:09)

  • Moin,

    ist klar, da der Aufruf vom Browser keinen Server findet und so auch kein --display :0 o.ä. angegeben hat um ihn damit zu öffnen.

    cya

    Code
    gnome-terminal --tab --title="Browser aus Cron" --display=:0 -x sh -c '/path/to/bin/firefox http://www.heise.de'

  • Moin,

    ist klar, da der Aufruf vom Browser keinen Server findet und so auch kein --display :0 o.ä. angegeben hat um ihn damit zu öffnen.

    cya

    Code
    gnome-terminal --tab --title="Browser aus Cron" --display=:0 -x sh -c '/path/to/bin/firefox http://www.heise.de'

    Und wo genau muss ich den Code einfügen damit es funktioniert ? :daumendreh2:

    Muss der in die Crontab Datei oder in mein Python script ? Ich vermute ersteres ...

    Ich weiß dass es das schon öfter gab , ich wurde aber bei Google und Co. nicht wirklich fündig .

    Einmal editiert, zuletzt von hechtfischen (23. April 2014 um 18:03)

  • Code
    */2 * * * * /usr/bin/python gnome-terminal --tab --title="Browser aus Cron" --display=:0 -x sh -c '/usr/ http://www.google.de' 2>&1

    jetzt erhalte ich aber leider in der cron.log die Fehlermeldung

    Zitat

    (CRON) info (No MTA installed, discarding Output)

    und der browser wird auch nicht geöffnet , soweit ich das sehe ..

    warum ? :s

    Einmal editiert, zuletzt von hechtfischen (23. April 2014 um 21:06)

  • MTA == Message Transfer Agent..
    cron versucht, deinen Output irgendwo unterzubringen...
    Da du den Fehlerkanal (2) auf den Standardkanal (1) umlenkst, cron aber keine pipe dafür hat, kommt diese Meldung... und die Fehlermeldung wird verschluckt...

    Vermutlich wird auch die shell, die cron aufgemacht hat, gleich wieder geschlossen..., deswegen siehst du nix


  • MTA == Message Transfer Agent..
    cron versucht, deinen Output irgendwo unterzubringen...
    Da du den Fehlerkanal (2) auf den Standardkanal (1) umlenkst, cron aber keine pipe dafür hat, kommt diese Meldung... und die Fehlermeldung wird verschluckt...

    Vermutlich wird auch die shell, die cron aufgemacht hat, gleich wieder geschlossen..., deswegen siehst du nix

    das heißt jetzt soweit ich das richtig verstanden habe:

    -> Cron versucht einen Output den ich erzeuge irgendwo hinzuschicken , der wird aber verschluckt , das stört mich aber nicht weiter oder !? :huh:

    -> wird jetzt Google.de aufgerufen oder nicht ? Laut deiner Erklärung schon oder ? :huh: :denker:

  • Vermutlich wird die Seite abgerufen, allerdings ist die shell, die cron aufmacht, gleich wieder zu... (bin ich nicht sicher...)

    Mir tut sich das ganze nicht auf, was dass soll:
    Per cron job 'n Fenster alle 2 Minuten aufploppen lassen? Na aber hallo :lol: - oder ist das als Stresstest für den Anwender gedacht?:s

  • Nein , ich brauche nur ein simples script das jede Stunde oder einmal am Tag ein Perl script auf meinem lokalen Webserver ausführt ... :D

    wenn du eine bessere Idee hast wie ich das realisieren kann immer her damit ... :no_sad:

  • Nein das script muss nur gestartet werden per browser , es fängt die Daten meiner Heizungssteuerung ab ( :D ) , die Daten reiche ich dann an rrdtool weiter und zeige sie mir im Heimnetz auf meinem lokalen Webserver auf dem Pi an ... aber das script muss eben per browser gestartet werden ...

    geht das auch noch anders ?

  • Nein , du verstehst das in der Tat nicht :D

    Also ich starte ein Perl script das einmal gestartet eigentlich immer läuft , dieses fängt die Daten die meine Heizungssteuerung schickt ab - meine Heizungssteuerung schickt menütlich Daten an das script - und zeigt diese Daten dann grafisch mit rrdtool an .

    Um das ganze einfacher anzuzeigen lasse ich das ganze auf einer einfachen HTML Seite dann schlussendlich anzeigen .

    Also die Bilder des rrdtool und ein paar andere Daten .


    Allerdings habe ich manchmal das Problem dass das Perl script grundlos abschmiert , eben deswegen möchte ich dass sicherheitshalber ein Crontab einmal täglich das script neu startet , also erneut per browser aufruft um es zu starten .

    Soweit verständlich ?

    Weißt du wie ich das machen kann ? :s

  • Einfach: (Konzept)
    Das Script ermittelt seine PID beim Start und schreibt sie in ein File, z.B. [font="Courier"]scriptname.pid[/font].
    Der Cron-Job pollt alle x Minuten/Stunden, ob es einen Prozess mit der PID gibt, der in dem File hinterlegt ist

    Code
    ps -ef | grep `cat scriptname.pid` | grep -v grep


    Findet es keinen Prozess (weil abgeschmiert), wird das Script neu gestartet... ansonsten wird nix gemacht... (oder nur ein Log geschrieben). :thumbs1:

    BTW: Ursache des Script-Absturzes schon mal ergründet ? :fies:

    Das Ergebnis der ps Zeile mit echo $? prüfen (also den Rückgabewert):
    0 == gefunden
    1 == nicht gefunden

  • Das klingt an sich ja ganz nett .. :shy:

    allerdings:

    Du willst also dass das perl Script am anfang seine Pid ermittelt ?
    Wie soll ich denn das in Perl machen ? :-/ [hatte ich noch nie gebraucht]

    und wie soll ich das script dann neu starten ? Das ist ja das eigentliche Problem ... das script muss per browser gestartet werden , ansonsten gibt es keine Daten an rrdtool weiter .


    Zum abschmieren des Scripts:
    Ich bin schon dabei den Fehler zu suchen , allerdings ist das ein bisschen gruselig ( :D ) da das script beliebig abschmiert (so kommt es mir zumindest vor) , manchmal kommt es auch vor dass es gar nicht abschmiert .

    Ich denke eher dass meine Heizung irgendwann irgendeinen Mist schickt mit dem mein Script nicht klar kommt ... aber bis ich den Fehler gefunden habe will ich das eben anders lösen . :s


    Ergänzung:

    Was mir da grad noch eingefallen ist und dein - wirklich gutes Konzept - über den Haufen werfen könnte ist , dass kein extra Prozess bei anlaufen des PERL Scripts gestartet wird , das Script läuft einfach unter dem PERL Prozess soweit ich das sehe ...

    Einmal editiert, zuletzt von hechtfischen (23. April 2014 um 23:43)


  • Du willst also dass das perl Script am anfang seine Pid ermittelt ?
    Wie soll ich denn das in Perl machen ? :-/ [hatte ich noch nie gebraucht]

    Muss ich morgen nachschauen, machen wir auf Arbeit "pausenlos" ... :)


    und wie soll ich das script dann neu starten ? Das ist ja das eigentliche Problem ... das script muss per browser gestartet werden , ansonsten gibt es keine Daten an rrdtool weiter .

    Hm, Zirkelschluss:
    Es ist immer noch nicht dargelegt, warum das Script aus dem Browser heraus gestartet werden muss...

    Vermutlich hast du da ein konzeptionelles Problem ==> KISS (Keep it simple and save): :s
    Ich taste hier z.B. mehrere Sensoren ab, die ihre Daten in eine DB schreiben. Das Ganze läuft "im Hintergrund" per cron job und script ... alle 2 Minuten...

    Die Webseite zur Darstellung greift auf die Daten in der DB zu.
    Somit ist Erfassung und Darstellung entkoppelt - was den Ablauf des Ganzen und die Fehlersuche erheblich vereinfacht(e)... ;)


    Zum abschmieren des Scripts:
    Ich bin schon dabei den Fehler zu suchen , allerdings ist das ein bisschen gruselig ( :D ) da das script beliebig abschmiert (so kommt es mir zumindest vor) , manchmal kommt es auch vor dass es gar nicht abschmiert .

    Ich denke eher dass meine Heizung irgendwann irgendeinen Mist schickt mit dem mein Script nicht klar kommt ... aber bis ich den Fehler gefunden habe will ich das eben anders lösen . :s

    Provisorien halten bekanntlich am längsten :lol::lol:


    Ergänzung:

    Was mir da grad noch eingefallen ist und dein - wirklich gutes Konzept - über den Haufen werfen könnte ist , dass kein extra Prozess bei anlaufen des PERL Scripts gestartet wird , das Script läuft einfach unter dem PERL Prozess soweit ich das sehe ...

    Hm, ok, das macht das filtern "etwas" aufwendiger, ggf. muss man da den Vaterprozess herausbekommen, ist aber keine Zauberei...

    Bei uns (auf Arbeit) werden Prozesse, die per Script gestartet werden und ihrerseits wiederum Java starten die dann wiederum forken auf diese Weise überwacht... echt übel... =(
    Aber tut (meistens jedenfalls), dass ist allerdings auch nicht über Nacht gelöst worden... :D (und auch nicht von mir... ich hab nur gestaunt, was geht) :lol:

  • Hi,

    kleine Anmerkung - habt ihr dran gedacht, dass das Script wegen der Sensor-Abfrage imho als root laufen muss?
    Der Eintrag selbst wie hier mal gepostet funktioniert ( ruft firefox auf - zumindest aus einem Terminal ), dann wird das Terminal geschlossen, aber der Browser ist noch auf.

    so long,
    -ds-

  • Zentris

    Also wie ich eine PID mit perl rausbekomme habe ich inzwischen herausgefunden , das steht auf der selfthtml seite :bravo2:

    Und , ja richtig , ich weiß nicht warum ich das Script per Browser starten muss , es läuft in der Konsole schon auch ab , aber allerdings liefert es da keine Daten an rrdtool :-/


    Ja wenn du mir sagst wie ich den Prozess des Scripts herausbekomme und ich das dann möglichst einfach umsetzen kann mach ich das auch , aber wie gesagt , da musst du mir helfen :daumendreh2:

    dreamshader

    Zitat

    kleine Anmerkung - habt ihr dran gedacht, dass das Script wegen der Sensor-Abfrage imho als root laufen muss?
    Der Eintrag selbst wie hier mal gepostet funktioniert ( ruft firefox auf - zumindest aus einem Terminal ), dann wird das Terminal geschlossen, aber der Browser ist noch auf.

    Nein , der Eintrag in Crontab der den Browser öffnen soll um eine bestimmte Website aufzurufen funktioniert eben nicht . :s

    Und ich hatte den Eintrag sowohl unter

    Code
    crontab -e

    als auch unter der Datei

    Code
    nano /etc/crontab

    als root eingetragen .

    Geht trotzdem nicht ... :-/

Jetzt mitmachen!

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