捕获输出而不重定向并将其保留在终端上

捕获输出而不重定向并将其保留在终端上

我需要捕获守护程序的输出,该守护程序还包括按需模式,并且根据输出是否发送到 tty 来表现不同。只要将 stdout 重定向到任何地方就会使其进入日志记录模式,在该模式下,它会以不方便的格式写入数据,而 ATM 则需要花费太多时间来重新配置它以执行其他操作/修复它/询问作者。

我可以以某种方式像往常一样运行它 - 即不进行重定向 - 但仍然可以获得它在文件中写入屏幕的所有内容的副本吗?

答案1

您可以使用socat使mydaemonstdout 成为伪终端设备,并将其中写入的所有数据发送到管道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/nullscript不会将您的终端设置为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脚本,但要注意它有一些错误和限制。

相关内容