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

출력을 리디렉션하는 방법과 bash에서 출력을 억제 하는 방법을 알고 있습니다 . 지금, 나는 실수로 명령 (예로 출력 리디렉션 부분에 추가하는 것을 잊었다 가정 2>&1이나 > /tmp/mystdout내 배경 프로세스가 이미 잠시 동안 실행)와, 난 여전히 곳으로 변경할 수 있습니다 stdoutstderr기록되고있다? 정말 응용 프로그램을 종료했다가 다시 시작하고 싶지 않습니다.

Gilles 가 자신의 의견 을 물었을 때보 다 구체적으로 설명하기 위해 다음 시나리오에서 구체적으로 설명하고 싶습니다.

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

또는 둘의 조합

예를 들어 Apache가 실행 중이고 파일 디스크립터를 수 있습니다 .

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


답변

reredirect ( https://github.com/jerome-pouiller/reredirect/ )를 사용하여 수행 할 수 있습니다 .

reredirect -m /dev/null <PID>

나중에 다음과 같은 방법으로 프로세스의 초기 출력을 복원 할 수 있습니다.

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

( <M><N>reredirect 이전 출시에 의해 제공된다).

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


답변

그건 불가능하다. 아니면 적어도 쉽지 않습니다. 프로세스에 gdb를 첨부하고 gdb에서 처리하면 운이 좋을 수도 있지만 성공만큼 쉽게 충돌이 발생할 수 있습니다.


답변

reptyr 을 사용 하여 다른 현재 프로세스를 새 현재 터미널에 연결 해야합니다 . 예를 들어 설치하고 GNU의 사용 screen유틸리티를하고있는 시작 reptyr“가져 오기”다른 프로세스의 리디렉션 (및 터미널 제어)에 명령을하고합니다 (새로운 현재 터미널에 첨부 screen당신이 시작하면, 과정 reptyr에서 screen). screen세션 에서이 작업을 수행 할 경우 얻을 수있는 장점은 에서 일단 한 번 screen연결을 끊었다가 다시 연결하기가 쉽다는 것입니다 (예 : 로컬 세션 종료, 집에 가서 다시 열기).