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?
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.
import sys; print("Hello, stderr", file=sys.stderr)
aby się upewnić.
exec python3.4 ~/webapp/PriceList/src/main.py > out.log 2> err.log
i spójrz na te pliki dziennika.
exec ... 2>&1
rzeczywiście dołącza standardowy błąd do standardowego wyjścia. Więc coś jeszcze jest nie tak.