Seite 1 von 1

Python Bash-Ausgaben loggen

Verfasst: Dienstag 14. Oktober 2014, 21:22
von RabenFlug
Hallo liebe Python Experten,

in meinem Hausbus befindet sich ein Raspberry Py als "Master", der Busnachrichten entgegennimmt und versendet. Das dort laufende Script habe ich in Python geschrieben. Das Script arbeitet mit dem seriellen Port, einer MySQL-DB usw. und funktioniert eigentlich sehr gut. Nach einiger Laufzeit (mehrere Tage) stürzt ein Thread aber immer ab. Da ich das Script aber mittels Putty als Hintergrundprozess starte, ist zu dem Zeitpunkt die Shell schon lange nicht mehr offen und ich sehe nicht was schief läuft:
pi@home:/python/underworld# sudo python underworld.py&
Ich habe schon versucht stdout zu "verbiegen" mittels > log.log am Ende, das nützt aber nichts, die Ausgaben des Scriptes werden nicht in die Datei geschrieben.

Habt ihr eine Idee wie ich das Script von Putty aus starten, und sämtliche Ausgaben in eine Datei umleiten kann?
Hoffentlich ist diese Frage nicht zu wenig Python-spezifisch.

Zu Python selbst kann ich nur sagen: absolut genial! (oder einfach 100% kompatibel mit mir :))
datenbank, threads, message queue, I/O (auf dem Raspberry), mehrere Rückgabewerte einer Funktion,... alles kein Problem. Super Sprache!

Re: Python Bash-Ausgaben loggen

Verfasst: Dienstag 14. Oktober 2014, 21:35
von Sirius3
@RabenFlug: startet das Skript einen Daemon? Ansonsten sollte es mit Ende der Shell abgebrochen werden. Um das zu verhindern startet man Hintergrundskripte mit nohup, dann wird die Ausgabe auch automatisch in eine Datei umgeleitet.

Re: Python Bash-Ausgaben loggen

Verfasst: Dienstag 14. Oktober 2014, 22:07
von BlackJack
So etwas wie `supervisord` oder `daemontools` könnte auch hilfreich sein.

Re: Python Bash-Ausgaben loggen

Verfasst: Mittwoch 15. Oktober 2014, 10:29
von Leonidas
Alternativ ein systemd-Service, da wird automatisch die Ausgabe ins journal geloggt, so dass man auch nach einigen Tagen noch sehen kann was da schiefgelaufen ist.

Re: Python Bash-Ausgaben loggen

Verfasst: Mittwoch 15. Oktober 2014, 10:48
von RabenFlug
Sirius3, das Script startet keinen Daemon sondern läuft (mit mehreren Threads) selbstständig. Durch das & am Ende des Befehls läuft das Script auch nach schleißen der Konsole weiter, wie bei nohup. Damit habe ich es gerade versucht, guter Tip! Einziger Wehmutstropfen: nohup schreibt das Logfile nohup.out stark verzögert. Aber egal, im Moment läuft das Script und nohup.out wächst. Sehr gut!!
BlackJack, falls nohup nicht zum Erfolg führt, lese ich mich supervisord ein, auch interessant!

Leonidas, kennst du ein entsprechendes systemd Tool?

Re: Python Bash-Ausgaben loggen

Verfasst: Mittwoch 15. Oktober 2014, 11:01
von cofi
Nein, durch `&` wird das Programm im Hintergrund gestartet, wird die startende Shell beendet, dann auch alle von ihr gestarteten Programme.

systemd ist das entsprechende Tool fuer systemd ;) Du musst nur ein entsprechendes Service-File fuer dein Programm schreiben.
Hier gibt es ein Beispiel fuer ein Python-Programm.
Das ganze macht aber nur Sinn, wenn du eh schon systemd einsetzt (bzw deine Distribution).

Dann gibt es noch die Moeglichkeit das logging Modul einzusetzen, wofuer du deine Ausgabe allerdings umschreiben musst.

Falls du die Ausgabe nur kurzzeitig brauchst gibt es noch die quick&dirty Variante im Skript selbst `sys.stdout` zu verbiegen:

Code: Alles auswählen

import sys
sys.stdout = open('program.output', 'w')