Python Bash-Ausgaben loggen

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
RabenFlug
User
Beiträge: 2
Registriert: Dienstag 14. Oktober 2014, 21:10
Wohnort: Niedersachsen

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!
Ey Jo Mr. White, Bitch!
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@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.
BlackJack

So etwas wie `supervisord` oder `daemontools` könnte auch hilfreich sein.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
RabenFlug
User
Beiträge: 2
Registriert: Dienstag 14. Oktober 2014, 21:10
Wohnort: Niedersachsen

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?
Ey Jo Mr. White, Bitch!
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

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')
Antworten