Przesyłanie danych wyjściowych skryptu bash po przekierowaniu stderr [zamknięte]

9

ze względu na sposób, w jaki mój host robi rzeczy, muszę korzystać z systemu usług.

Ta usługa ma uruchamiany plik uruchamiania i przesyła do drugiego pliku uruchamiania. Ale używam (podanego) pakietu python, który loguje się do stderr zamiast stdout i nie mogę tego zrobić tak, jak chcę.

Mam więc skrypt uruchamiania dla mojej usługi:

#!/bin/sh
cd ~/webapp/PriceList
exec python3.4 ~/webapp/PriceList/src/main.py

który jest przesyłany do systemu rejestrującego:

#!/bin/sh
exec multilog t ./main

Ale rura nie łączy stderr (zgodnie z oczekiwaniami). Więc po google dodałem przekierowanie do mojego biegu:

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

Ale to nie rozwiązuje mojego problemu: moje własne dane wyjściowe (na standardowe wyjście przy użyciu drukowania pytonów) są rejestrowane zgodnie z oczekiwaniami. Dane wyjściowe stderr nie są rejestrowane.

Jeśli przekieruję zmodyfikowany skrypt uruchomieniowy na dwa pliki, oznacza to, że nie ma przekierowania (stderr nadal działa na stderr). Jak zmodyfikować przekierowanie, aby działało?

Xavour
źródło
5
exec ... 2>&1rzeczywiście dołącza standardowy błąd do standardowego wyjścia. Więc coś jeszcze jest nie tak.
thrig
3
Czy jest jakaś szansa, że ​​skrypt Pythona zamyka stderr i otwiera go ponownie jako plik? Poszukaj połączenia dup2()w kodzie. Każdy pomysł, gdzie wyjście stderr się dzieje? Inna myśl: być może plik run twojego hosta przekierowuje stderr w ten sposób przed uruchomieniem twojego kodu.
Edward Falk,
1
Czy możesz absolutnie potwierdzić, że tekst jest wysyłany do stderr? Zamień skrypt na taki, który mówi, import sys; print("Hello, stderr", file=sys.stderr)aby się upewnić.
rosuav
3
Naprawdę stderr? Spróbuj tego exec python3.4 ~/webapp/PriceList/src/main.py > out.log 2> err.logi spójrz na te pliki dziennika.
ingopingo
2
Co się stanie, jeśli użyjesz bash zamiast sh?
Luciano Andress Martini

Odpowiedzi:

0

Proszę spróbować:

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

tzn .: exec 2>&1w osobnym wierszu, mówiącym o przekierowaniu stderr do tej samej rzeczy, do której zmierza stdout (twój terminal? lub mail, jeśli znajduje się w crontab?), a następnie cd & exec, aby zastąpić istniejący proces python3.2. Zauważ, że przełączyłem się na bash zamiast sh, dla mniejszej przenośności, ale zwykle o wiele lepszej niezawodności. Jeśli to zadziała, świetnie, jeśli nie, wkroczą jakieś lepiej poinformowane osoby. (Nie mam teraz czasu na badania w tej sprawie)

Olivier Dulac
źródło