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


11

출력을 리디렉션하는 방법과 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

다른 터미널로 변경 하시겠습니까? 아니면 파일로? 현재 터미널이나 새 화면 세션에 연결 한 내용이 있는 경우 실행중인 프로세스를 제거하고 새 화면 셸에 연결하려면 어떻게해야합니까?를 참조하십시오.
Gilles 'SO- 악한 중지

답변:


8

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 만 리디렉션하는 방법도 설명합니다.


3

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





1
좀 빠지는. 다른 버그에 연결된 모든 도구는 다른 터미널 / 스크린 세션에 연결하는 것입니다. 다른 파일로 리디렉션하는 것이 아닙니다. reptyr를 패치하여 파일로 리디렉션하는 것은 어렵지 않습니다.
Dennis Kaarsemaker

나는 reptyr의 출처를 조금 보았고 대답의 "쉽지 않은"부분에 가장 동의합니다. 몇 시간 후에 더 깊이 들어갈 수 있습니다.
gertvdijk

2

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


귀하의 답변에 감사드립니다. 그러나 터미널 분리 / 다시 연결에 대해 묻지 않으므로 제 경우에는 도움이되지 않습니다. 내 질문과 예제를 다시 읽으십시오.
gertvdijk

아, 그 경우 : reptyr 코드를 읽고 stdout 또는 stderr 만 리디렉션하도록 수정하는 방법을 찾으십시오. 그런 다음 새로 연결된 스트림을 원하는 곳으로 리디렉션하는 다른 셸에서 실행합니까? (또는 더 나은, reptyr 소스를 사용하여 직접 리디렉션을 수행)
Olivier Dulac
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.