Aufgrund der Art und Weise, wie mein Hoster Dinge tut, muss ich ein System für Dienste verwenden.
Dieser Dienst verfügt über eine Ausführungsdatei, die er ausführt und in eine zweite Ausführungsdatei weiterleitet. Aber ich verwende ein (gegebenes) Python-Paket, das sich bei stderr anstelle von stdout anmeldet, und ich kann es nicht dazu bringen, das zu tun, was ich will.
Ich habe also ein Ausführungsskript für meinen Dienst:
#!/bin/sh
cd ~/webapp/PriceList
exec python3.4 ~/webapp/PriceList/src/main.py
welches in den Lauf des Protokollierungssystems geleitet wird:
#!/bin/sh
exec multilog t ./main
Aber das Rohr verbindet stderr nicht (wie erwartet). Nachdem ich gegoogelt hatte, fügte ich meinem Lauf eine Umleitung hinzu:
#!/bin/sh
cd ~/webapp/PriceList
exec python3.4 ~/webapp/PriceList/src/main.py 2>&1
Dies löst jedoch nicht mein Problem: Meine eigenen Ausgaben (mit Python-Druck stdout) werden wie erwartet protokolliert. Die stderr-Ausgabe wird nicht protokolliert.
Wenn ich mein geändertes Runscript in zwei Dateien umlenke, wird angezeigt, dass keine Umleitung erfolgt (stderr ist immer noch auf stderr). Wie muss ich meine Umleitung ändern, damit sie funktioniert?
dup2()
im Code nach einem Anruf bei. Jede Idee , wo die stderr - Ausgabe ist los? Ein anderer Gedanke: Vielleicht leitet die Ausführungsdatei Ihres Hosters stderr auf diese Weise um, bevor Sie Ihren Code starten.
import sys; print("Hello, stderr", file=sys.stderr)
, das sicherstellt.
exec python3.4 ~/webapp/PriceList/src/main.py > out.log 2> err.log
und werfen Sie einen Blick in diese Protokolldateien.
exec ... 2>&1
verbindet tatsächlich Standardfehler mit Standardausgang. Also ist etwas anderes schief.