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?
quelle
exec ... 2>&1
verbindet tatsächlich Standardfehler mit Standardausgang. Also ist etwas anderes schief.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.Antworten:
Bitte versuche:
Das heißt: In
exec 2>&1
einer separaten Zeile wird angegeben, dass stderr an dasselbe weitergeleitet werden soll, an das stdout gesendet wird (Ihr Terminal? oder E-Mail, wenn es sich in einer Crontab befindet?), gefolgt von cd & exec, um den vorhandenen Prozess durch den Python3.2-Prozess zu ersetzen. Beachten Sie, dass ich anstelle von sh zu bash gewechselt habe, um eine geringere Portabilität, aber normalerweise eine viel bessere Zuverlässigkeit zu erzielen. Wenn dies funktioniert, werden großartige, wenn nicht besser informierte Personen eingreifen. (Ich habe momentan keine Zeit, diesbezüglich Nachforschungen anzustellen.)quelle