주문형 모드도 포함하고 출력이 tty로 전송되는지 여부에 따라 다르게 동작하는 데몬의 출력을 캡처해야 합니다. stdout을 아무데나 리디렉션하면 불편한 형식으로 데이터를 쓰는 로깅 모드로 전환되고 ATM은 다른 작업을 수행하기 위해 재구성/수정/저자에게 문의하는 데 너무 많은 시간이 걸립니다.
어떻게든 평소대로(예: 리디렉션 없이) 실행할 수 있지만 화면에 기록하는 모든 내용의 복사본을 파일로 얻을 수 있습니까?
답변1
socat
stdout을 의사 터미널 장치로 만들고 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
ls
stdout이 어떻게 새로운 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
스크립트가 함께 제공되지만 일부 버그와 제한 사항이 있다는 점에 유의하세요.