실행 중인 프로세스 출력을 파이프에서 다른 것으로 리디렉션하려면 어떻게 해야 합니까?

실행 중인 프로세스 출력을 파이프에서 다른 것으로 리디렉션하려면 어떻게 해야 합니까?

stdout(1)을 이 "파이프"에서 다음으로 리디렉션할 수 있는 방법이 있습니까? (이것을 정확히 어떻게 설명할 수 있는지는 모르겠습니다. 누군가 이 문제를 처리하는 방법을 설명하거나 이에 대한 내용을 읽어주면 매우 기쁠 것입니다.) 다른 출력, 예. 파일인가, 터미널인가?

-bash-4.2$ ls -l /proc/11/fd
total 0
lrwx------ 1 us sudo 64 Sep 24 11:26 0 -> /dev/null
l-wx------ 1 us sudo 64 Sep 24 11:26 1 -> pipe:[20619]
l-wx------ 1 us sudo 64 Sep 24 11:26 2 -> pipe:[20620]
lrwx------ 1 us sudo 64 Sep 24 11:26 3 -> socket:[30376]
lr-x------ 1 us sudo 64 Sep 24 11:26 4 -> /dev/null
l-wx------ 1 us sudo 64 Sep 24 11:26 5 -> pipe:[30639]
lrwx------ 1 us sudo 64 Sep 24 11:26 6 -> socket:[27522]

답변1

깨끗하거나 휴대 가능한 방식이 아닙니다. 예를 들어 gdb일부 개체 파일을 열고 이를 fd1에 복사하는 등 디버거를 연결해야 합니다 . 그리고

gdb -p <PID> -batch -ex 'call dup2(open("<PATH>", 2), 1)'

이것은 쉘 구조에 의해 생성된 pipe:[digits]"익명" 파이프입니다 .cmd | cmd

그러나 Linux에서는 /proc/<PID>/fd/<NUM>.심지어)를 사용하는 것보다 gdb: 파이프의 반대쪽을 열고, 파이프에서 읽는 모든 프로그램을 종료하고, cat다른 곳에서 삭제합니다. 어리석은 예:

% while sleep 1; do TZ=Zulu date; done | wc -c &
[1] 26727
% ps
  PID TTY          TIME CMD
20330 pts/1    00:00:00 bash
26726 pts/1    00:00:00 bash     # this the while ... done process
26727 pts/1    00:00:00 wc
26745 pts/1    00:00:00 sleep
26746 pts/1    00:00:00 ps
% ls -l /proc/26726/fd/1
... /proc/26726/fd/1 -> 'pipe:[1294932]'
% exec 7</proc/26726/fd/1        # open the other side of the pipe
% kill 26727                     # kill wc -c
% cat <&7
Fri 24 Sep 2021 01:25:52 PM UTC
Fri 24 Sep 2021 01:25:53 PM UTC
Fri 24 Sep 2021 01:25:54 PM UTC
...

관련 정보