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