Keine Ausgabe auf umgeleitete stdout

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

    ich habe in rc.local einen Eintrag zum automatischen start eines PY-scripts mit Umleitung von stdout und stderr.

    /home/pi/solar/rrdtool_getdata_solar.py >>/home/pi/solar/output.log 2>&1 &

    Leider kommt aber nichts an in output.log
    Das Programm läuft (kontrolliert mit ps -ef | grep python) und auch die Datenspeicherung funktioniert.
    Wo liegt mein Fehler?

    Danke für die Unterstützung.

    Gruß
    martin

  • Natürlich hat das script Ausgaben. :)
    z.B. print "erstellt: ",input6

    Läuft am Anfang noch als Kontrolle, wird später dann abgeschaltet.
    Wenn ich das script von der Konsole starte kommen die Ausgaben auch.

    Ich muss aber meine Frage etwas ändern:
    Heute morgen war eine Ausgabedatei da.
    Das script läuft in einer Endlosschleife.
    Es erfolgt alle 60 Sekunden eine Ausgabe.
    Die letzte Ausgabe in der Datei ist 09:11 Uhr, jetzt ist es aber 09:31 Uhr
    Kann es sein, dass die Ausgabe erst erscheint wenn der Ausgabe-Puffer voll ist bzw. das Programm beendet wird?
    Ich dachte, die Ausgabe erfolgt spätestens nach einem CR/LF?

    Gruß
    Martin

  • > Kann es sein, dass die Ausgabe erst erscheint wenn der Ausgabe-Puffer voll ist bzw. das Programm beendet wird?
    Ja, das ist ein haeufiges Problem mit dem Standard Output

    Wenn das File immer um 4KB waechst, ist das ein starker Hinweis auf das Buffering

    > Ich dachte, die Ausgabe erfolgt spätestens nach einem CR/LF?
    Wahrscheinlich nicht, weil das viel Performance fressen wuerde.

    Bewirkt sys.stdout.flush() etwas ?

    Einmal editiert, zuletzt von Tell (23. Januar 2015 um 11:06)

  • ..ich wollt grad sagen - wir kennen das Script gar nicht, können also auch nicht wirklich sagen ob es tatsächlich funktionieren müsste... Glaskugeln sind unbezahlbar

    Aber [code=php]sys.stdout.flush()[/php]wird mit Sicherheit Abhilfe schaffen. Wobei wir auch jetzt erst sehen das du Serial verwendest - auch hier gibt es selbstverständlich einen Buffer der auch Probleme bereiten könnte.

    Aber eins nach dem anderen. Pass dein Script also mal wie folgt an:

    [code=php]
    #!/usr/bin/env python
    import serial
    import os
    import sys
    import time
    sys.path.append('/path/to/rrdtool/lib/python2.6/site-packages/')
    import rrdtool

    ser = serial.Serial('/dev/ttyUSB0', 9600)
    # Auslesen und Anzeige und abspeichern in einer endlosschelife:
    while 1 :
    input1=ser.readline()

    #Schreiben in RRD
    # template HA:BK:P1:P2:TK:TR:TS:TV:V:TA:XX
    TEMPLATE='HA:BK:P1:P2:TK:TR:TS:TV:V:TA:XX'
    #print TEMPLATE
    RRD_DATAFILE="/home/pi/solar/solaranlage.rrd"
    print "gelesen: ",input1

    input2 = input1.replace(";",":")
    input3 = input2.replace("\r","")
    input4 = input3.replace(",",".")
    input5 = input4.replace("\n","")

    input6 = 'N:' + input5 + ':0:0'
    print "erstellt: ",input6
    utc_time = time.time()
    lt = time.localtime(utc_time)
    jahr, monat, tag = lt[0:3]
    stunde, minute, sekunde = lt[3:6]
    print "%02i.%02i.%04i %02i:%02i:%02i -- %10.0f" % (tag,monat,jahr,stunde,minute,sekunde,utc_time)
    # print time.strftime("Datum und Zeit: %c", lt)
    sys.stdout.flush()

    rrdtool.update (RRD_DATAFILE,
    '--template', TEMPLATE,
    input6 )
    [/php]

  • Hallo,

    aktueller Stand:
    Die Datei wächst tatsächlich immer um 4 KB. Der Output ist auch mitten in der Zeile abgeschnitten.
    Vermutlich wird also exakt bei erreichen von 4KB der Output geschrieben.
    Ist natürlich blöd, wenn das Programm abstürzt oder der raspberry durch Stromausfall stehen bleibt.
    Ich habe jetzt das script entsprechen dem Vorschlag angepasst.

    Starte jetzt den raspberry neu und schau mal ob sofort ein Output kommt.
    ...
    ...
    ...
    JA:bravo2:

    Die Ausgabedatei ist sofort da.
    Damit ist mein Problem gelöst

    Danke für die Unterstützung.
    Gruß
    Martin

Jetzt mitmachen!

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