stderr 경로 재 지정 후 bash 스크립트 출력 파이핑 [닫기]


9

호스트가하는 일 때문에 서비스를 위해 시스템을 사용해야합니다.

이 서비스에는 실행 파일이 있으며 두 번째 실행 파일로 파이프됩니다. 그러나 stdout 대신 stderr에 로그하는 (주어진) python 패키지를 사용하고 원하는 것을 수행 할 수 없습니다.

그래서 내 서비스에 대한 실행 스크립트가 있습니다.

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

로깅 시스템 실행에 파이프됩니다.

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

그러나 파이프는 예상대로 stderr을 연결하지 않습니다. 인터넷 검색 후 실행에 리디렉션을 추가했습니다.

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

그러나 이것은 내 문제를 해결하지 못합니다 : pythons print를 사용하여 stdout으로 내 출력이 예상대로 기록됩니다. stderr 출력은 기록되지 않습니다.

수정 된 런 스크립트를 두 파일로 리디렉션하면 리디렉션이 없음을 나타냅니다 (stderr가 여전히 stderr에 있음). 리디렉션을 수정하려면 어떻게해야합니까?


5
exec ... 2>&1실제로 표준 오류를 표준 출력에 결합시킵니다. 그래서 다른 것이 엉망입니다.
thrig

3
파이썬 스크립트가 stderr을 닫고 파일로 다시 열 가능성이 있습니까? dup2()코드에서 전화를 찾으십시오 . stderr 출력 어디로 가고 있는지 아십니까? 또 다른 생각 : 아마도 호스트의 실행 파일이 코드를 시작하기 전에이 방법으로 stderr를 리디렉션합니다.
Edward Falk

1
텍스트가 stderr로 전송되고 있음을 절대적으로 확인할 수 있습니까? 스크립트를 import sys; print("Hello, stderr", file=sys.stderr)확실하게 바꾸십시오.
rosuav

3
정말 stderr? 이것을 시도 하고이 exec python3.4 ~/webapp/PriceList/src/main.py > out.log 2> err.log로그 파일을 살펴 보십시오 .
ingopingo

2
sh 대신 bash를 사용하면 어떻게됩니까?
Luciano Andress Martini

답변:


0

시도하십시오 :

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

즉 : exec 2>&1별도의 줄에서 stderout을 stdout과 동일한 것으로 리디렉션하도록 지시합니다 (터미널 또는 crontab의 경우 메일?). 그런 다음 cd 및 exec를 사용하여 기존 프로세스를 python3.2 프로세스로 바꿉니다. 이식성이 떨어지지 만 일반적으로 훨씬 더 나은 안정성을 위해 sh 대신 bash로 전환했습니다. 이것이 효과가 있다면, 더 잘 아는 사람이 아니라면 훌륭 할 것입니다. (지금은 조사 할 시간이 없습니다)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.