실행 중인 프로세스의 출력 리디렉션을 변경하는 방법은 무엇입니까?

실행 중인 프로세스의 출력 리디렉션을 변경하는 방법은 무엇입니까?

출력을 리디렉션하는 방법과 방법을 알고 있습니다.그들을 진압하다배쉬에서. 이제 실수로 출력 리디렉션 부분을 명령(예: 2>&1또는 > /tmp/mystdout)에 추가하는 것을 잊어버렸고 백그라운드 프로세스가 한동안 실행 중이었다고 가정하면 여전히 기록되는 위치로 변경할 수 있습니까 stdout? stderr나는 정말로 응용 프로그램을 종료하고 다시 시작하고 싶지 않습니다.

요청한 대로 더 구체적으로 작성해 주세요.자일스그의 의견에서 저는 특히 다음과 같은 시나리오에서 이를 다루고 싶습니다.

  • 잘못된 출력 파일
  • stderr다음으로 리디렉션하는 것을 잊었습니다 .stdout

아니면 둘 다의 조합

예를 들어, 저는 Apache를 실행 중이고 다음을 수행할 수 있습니다.바라보다파일 설명자:

/proc/8019/fd/0 -> /dev/null
/proc/8019/fd/1 -> /dev/null
/proc/8019/fd/2 -> /var/log/apache2/error.log

답변1

리디렉션을 사용할 수 있습니다(https://github.com/jerome-pouiller/reredirect/).

reredirect -m /dev/null <PID>

나중에 다음 명령을 사용하여 프로세스의 초기 출력을 복원할 수 있습니다.

reredirect -N -O <M> -E <N> <PID>

( 이전에 시작된 리디렉션에 의해 제공됨) <M>.<N>

reredirect는 README다른 명령이나 stdout 또는 stderr로 리디렉션하는 방법도 설명합니다.

답변2

그것은 불가능합니다. 아니면 적어도 쉽지는 않습니다. gdb를 프로세스에 연결하고 gdb에서 조작하는 데 운이 좋을 수도 있지만 이로 인해 성공만큼이나 쉽게 충돌이 발생할 수 있습니다.

답변3

당신은 사용해야합니다렙텔새로운 현재 터미널에 다른 프로세스를 연결합니다. 예를 들어, GNU screen유틸리티를 설치 및 사용하고 reptyr그 안에 있는 명령을 실행하여 다른 프로세스의 리디렉션(및 터미널 제어)을 "가져오고" 이를 새로운 현재 터미널( 에서 시작한 screen경우 해당 프로세스 )에 연결합니다. 세션에서 이 작업을 수행할 때의 장점은 일단 상태에 있으면 쉽게 연결을 끊었다가 다시 연결할 수 있다는 것입니다(예: 로컬 세션을 닫고 집으로 갔다가 다시 열림).reptyrscreenscreenscreen

관련 정보