실행 중인 프로세스의 표준 출력을 표시하지 않으려면 어떻게 해야 합니까?

실행 중인 프로세스의 표준 출력을 표시하지 않으려면 어떻게 해야 합니까?

장기적으로 많은 표준 출력을 제공할 때 실행 중인 프로세스를 종료하고 다시 실행하고 싶지 않을 것입니다. 출력이 표시되지 않는 이유는 무엇입니까? 감사해요.

답변1

한 가지 방법은 프로세스에 디버거를 연결하고 /dev/null에서 표준 출력을 열도록 하는 것입니다.

gdb --batch -ex 'call close(1)' -ex 'call open("/dev/null",2)' -p "$pid"

답변2

여기 @jimmij가 지적한 솔루션을 가져와서 약간 수정하겠습니다.

(gdb) attach <pid>    
... 
(gdb) call open("/dev/null",O_WRONLY)
$1 = 3
(gdb) call dup2($1,fileno(stdout))
$2 = 1
(gdb) call close($1)
...
(gdb) detach
...

gdb에 익숙하지 않은 사람들을 위해 설명하자면 "attach", "call" 및 "detach"는 gdb 명령입니다. 정보를 얻으려면 gdb 프롬프트에서 "help Attach"를 사용하십시오. "open", "dup2" 및 "close"는 라이브러리 함수입니다. "man 2 open"을 통해 정보를 얻으세요.

여기서 O_WRONLY는 1과 같고 fileno(stdout)는 1과 같습니다. 리터럴 값을 사용하십시오. 그렇지 않으면 gdb에서 기호 누락에 대해 불평할 수 있습니다.


이미 열려 있는 파일 설명자를 찾고 싶다면 그렇게 할 수 있습니다.

$ cd /proc/<pid>/fd
$ for i in * ; do
          if [[ `readlink $i` == "/dev/null" ]]
                  fd=$i ; break
          fi
  done

답변3

다음은 정상적인 반환과 오류 메시지를 방지합니다.

2&>1 >/dev/null

관련 정보