Linux: 将标准输出和标准错误发送到套接字

6
我希望将标准输出(stdout)和标准错误(stderr)重定向到套接字(socket),然后可以通过以太网远程监视我的应用程序状态。目前我是通过使用ssh并在shell控制台中查看输出来完成这个操作的。如果可能的话,我更希望消除中间环节,直接将整个stdout和stderr输出发送到udp或tcp/ip端口,并让我的监视计算机连接到它。注意,我不能使用UART或任何其他有线连接,必须使用以太网。此外,如果可能的话,我希望通过bash脚本实现,以免重新构建我的应用程序。谢谢帮忙。
2个回答

8
按照您的描述,似乎您需要让现有应用程序打开一个被动套接字并等待连接,或者将您的应用程序包装在能够建立侦听套接字的东西中。这篇文章表明,仅使用Bash不可能实现此操作,但可以通过netcat或perl在命令行上实现。例如,您可以使用netcat执行以下操作:nc -l -p <port> -c "tail -F /var/log/blah"

6
在被监视应用程序方面,有一种方法可以将两个输出重定向到一个出站连接,使用netcat: $ ./application 2>&1 | nc 这样,你将stderr重定向到stdout,然后将它们全部一起管道传输到netcat中,netcat会负责设置套接字,与远程主机建立连接等等。
但是,请注意,如果你使用printf()函数写入stdout,你可能会遇到缓冲问题。在我的本地测试中,我发现应用程序发送到stderr的数据会立即在另一端看到,但是发送到stdout的数据只有在应用程序退出或者缓冲区中有足够的数据才会一次性刷新。因此,如果你关心监控端信息的顺序和可用性,建议你在打印有趣的内容到stdout时调用fflush(stdout);或者将对printf()、fprintf()等的调用替换为不进行缓冲的write()。当然,这样做需要修改应用程序的代码,但我不知道有什么办法可以从bash外部强制刷新应用程序的输出缓冲区。

1
我建议您将nc命令更改为nc -l <port>,以使应用程序等待监视器连接,就像OP所描述的那样。 - thuovila
其他取消stdout缓冲的方法在https://dev59.com/N3A75IYBdhLWcg3wH1NB中有描述。 - thuovila
@thuovila 不,我认为nc命令是正确的,因为这发生在“客户端”,它将连接到监视“服务器”并将应用程序的输出发送到该服务器。那个-l选项在监视“服务器”上有意义,但不适用于通信的这一侧(正如我在帖子的第一句话中所述)。 - asamarin
1
如果有人想将它们分开,可以使用进程替换来处理 stderrstdout,像这样:$ ./application 2> >(nc <host> <err-port>) > >(nc <host> <out-port>) - Ciprian Tomoiagă

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接