我需要捕获守护程序的输出,该守护程序还包括按需模式,并且根据输出是否发送到 tty 来表现不同。只要将 stdout 重定向到任何地方就会使其进入日志记录模式,在该模式下,它会以不方便的格式写入数据,而 ATM 则需要花费太多时间来重新配置它以执行其他操作/修复它/询问作者。
我可以以某种方式像往常一样运行它 - 即不进行重定向 - 但仍然可以获得它在文件中写入屏幕的所有内容的副本吗?
答案1
您可以使用socat
使mydaemon
stdout 成为伪终端设备,并将其中写入的所有数据发送到管道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
脚本,但要注意它有一些错误和限制。