리디렉션하지 않고 출력을 캡처하고 터미널에 보관합니다.

리디렉션하지 않고 출력을 캡처하고 터미널에 보관합니다.

주문형 모드도 포함하고 출력이 tty로 전송되는지 여부에 따라 다르게 동작하는 데몬의 출력을 캡처해야 합니다. stdout을 아무데나 리디렉션하면 불편한 형식으로 데이터를 쓰는 로깅 모드로 전환되고 ATM은 다른 작업을 수행하기 위해 재구성/수정/저자에게 문의하는 데 너무 많은 시간이 걸립니다.

어떻게든 평소대로(예: 리디렉션 없이) 실행할 수 있지만 화면에 기록하는 모든 내용의 복사본을 파일로 얻을 수 있습니까?

답변1

socatstdout을 의사 터미널 장치로 만들고 mydaemon여기에 기록된 모든 데이터를 파이프로 보낼 수 있습니다 socat.

ls -l /proc/self/fd대신 여기를 이용하세요mydaemon

$ socat  -u 'exec:"ls -l /proc/self/fd",pty,raw' - | tee file.out
total 0
lrwx------ 1 stephane stephane 64 Aug 20 13:32 0 -> /dev/pts/25
lrwx------ 1 stephane stephane 64 Aug 20 13:32 1 -> /dev/pts/26
lrwx------ 1 stephane stephane 64 Aug 20 13:32 2 -> /dev/pts/25
lr-x------ 1 stephane stephane 64 Aug 20 13:32 3 -> /proc/30930/fd

lsstdout이 어떻게 새로운 pty 장치가 되는지 확인하세요 ( /dev/pts/26)

없는 경우 다음을 socat사용할 수도 있습니다 script.

$ script -qc 'stty raw; ls -l /proc/self/fd' file.out < /dev/null
total 0
lrwx------ 1 stephane stephane 64 Aug 20 13:35 0 -> /dev/pts/26
lrwx------ 1 stephane stephane 64 Aug 20 13:35 1 -> /dev/pts/26
lrwx------ 1 stephane stephane 64 Aug 20 13:35 2 -> /dev/pts/26
lr-x------ 1 stephane stephane 64 Aug 20 13:35 3 -> /proc/31010/fd

( 이렇게 < /dev/null하면 script터미널이 raw모드로 설정되지 않습니다).

하지만 이 경우 모든 stdin, stdout 및 stderr이 이 pty로 리디렉션된다는 점에 유의하세요. 이 방법과 마찬가지로 stdin 및 stderr을 변경하지 않으려면 socat다음을 수행하십시오.

$ script -qc 'stty raw; exec <&3 2>&4 3<&- 4>&-; ls -l /proc/self/fd' file.out 3<&0 4>&2 < /dev/null
total 0
lrwx------ 1 stephane stephane 64 Aug 20 13:37 0 -> /dev/pts/25
lrwx------ 1 stephane stephane 64 Aug 20 13:37 1 -> /dev/pts/26
lrwx------ 1 stephane stephane 64 Aug 20 13:37 2 -> /dev/pts/25
lr-x------ 1 stephane stephane 64 Aug 20 13:37 3 -> /proc/31065/fd

모든 script구현/버전이 지원 -c되거나 -q옵션이 되는 것은 아닙니다.

일부 시스템에는 unbuffer expect스크립트가 함께 제공되지만 일부 버그와 제한 사항이 있다는 점에 유의하세요.

관련 정보