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?


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)

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.