2016-06-20 6 views
0

ich meinen Dienst fange an einem Raspberry Pi 2 (Raspbian) Ausführen eines Befehls in rc.local verwendet, die wie folgt aussieht:Warum kann ich nicht umleiten stdout eines Python-Skript in eine Datei

python3.4 /home/pi/SwitchService/ServiceStart.py >/home/pi/SwitchService/log & 
python3.4 /home/pi/test.py >/home/pi/log2 & 

Für einige Ursache Ich sehe keinen Text in der Protokolldatei meines Dienstes, obwohl das Skript auf stdout druckt.

die beiden Skripte wie folgt aussehen:

test.py

print("Test") 

ServiceStart.py

from Server import Server 
print("Test") 
if __name__ == "__main__": 
    server = Server() 

Weil ich nicht die Bash-Lösung arbeiten konnte Ich habe versucht this other solution, ob das für mich funktioniert. Es verhält sich genauso wie die Bash-basierte Methode. Daher schreibt mein Dienst nichts in die Protokolldatei, obwohl die leere Datei erstellt wurde.

+2

Sind Sie sicher, dass das Skript tatsächlich ausgeführt wird? Startup-Routinen haben normalerweise nicht "PATH" gesetzt, so dass es nicht wissen kann, wo sich 'python3.4' ohne seinen vollständigen Pfad befindet. –

+0

Sind Sie sicher, dass ServiceStart auf stdout schreibt? Oder schreibt es an stderr? Was passiert, wenn du es nicht dämonisierst? Gibt es etwas aus? Zu welcher Standarddatei? Stout oder stderr? – pah

+0

@ Mr.Llama Ich kann bestätigen, dass das Skript ausgeführt wird, da ich den Dienst verwenden kann. –

Antwort

2

Stellen Sie zunächst sicher, dass Ihr Skript tatsächlich ausgeführt wird. Viele Scheduler und Startroutinen haben PATH nicht festgelegt, so dass es python3.4 nicht finden kann. Versuchen Sie, den Befehl so zu ändern, dass er den vollständigen Pfad enthält (z. B. /full/path/python3.4).

Zweitens ist es nicht empfehlenswert, lange laufende Skripte in rc.local einzuschließen, ohne sie im Hintergrund laufen zu lassen (the documentation sagt sogar dies). Der Raspberry Pi wartet darauf, dass die Befehle beendet werden, bevor der Bootvorgang fortgesetzt wird. Wenn der Raspberry Pi also für immer ausgeführt wird, wird er möglicherweise nie vollständig gestartet.

Schließlich, vorausgesetzt, die vorherigen beiden Probleme wurden berücksichtigt, stellen Sie sicher, dass Ihr Programm die Ausgabe nicht zu aggressiv Pufferung ist. Sie können versuchen flushing stdout um zu sehen, ob das hilft.

+3

Danke für Ihre Antwort. Ich habe mich um die ersten beiden Probleme gekümmert. Die Lösung war, stdout zu spülen (obwohl das scheint ziemlich komisch zu tun jedes Mal). In meinem Fall habe ich '-u' zum Aufruf des Python-Skripts hinzugefügt. –