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?
źródło
exec ... 2>&1
rzeczywiście dołącza standardowy błąd do standardowego wyjścia. Więc coś jeszcze jest nie tak.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.Odpowiedzi:
Proszę spróbować:
tzn .:
exec 2>&1
w 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)źródło