Weiterleiten der Ausgabe eines Bash-Skripts nach Umleitung von stderr [geschlossen]

9

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?

xavor
quelle
5
exec ... 2>&1verbindet tatsächlich Standardfehler mit Standardausgang. Also ist etwas anderes schief.
Thrig
3
Gibt es eine Chance, dass das Python-Skript stderr schließt und es als Datei erneut öffnet? Suchen Sie 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.
Edward Falk
1
Können Sie absolut bestätigen, dass Text an stderr gesendet wird? Ersetzen Sie das Skript durch ein Skript import sys; print("Hello, stderr", file=sys.stderr), das sicherstellt.
Rosuav
3
Wirklich stderr? Versuchen Sie dies exec python3.4 ~/webapp/PriceList/src/main.py > out.log 2> err.logund werfen Sie einen Blick in diese Protokolldateien.
Ingopingo
2
Was passiert, wenn Sie bash anstelle von sh verwenden?
Luciano Andress Martini

Antworten:

0

Bitte versuche:

#!/usr/bin/env bash
exec 2>&1
cd ~/webapp/PriceList
exec python3.4 ~/webapp/PriceList/src/main.py

Das heißt: In exec 2>&1einer 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.)

Olivier Dulac
quelle