Linux:stdout和stderr到套接字

It'*_*ete 4 c sockets linux console

我想将stdout和stderr重定向到一个套接字,然后可以用来通过以太网远程监视我的应用程序的状态。目前,我通过使用ssh并在shell控制台中查看输出来完成此操作。如果可能的话,我希望删除中间人,然后将整个stdout和stderr输出发送到udp或tcp / ip端口,并将监视计算机连接到该端口。

我不能使用UART或任何其他有线连接。它必须是以太网。另外,如果可能的话,我想通过bash脚本来完成此操作,以防止必须重建我的应用程序。

谢谢您的帮助。

spi*_*kus 5

用您描述它的方式,听起来您将需要现有的应用程序来打开一个被动套接字并等待连接,或者您必须将您的应用程序包装在设置侦听套接字的内容中。这篇文章建议仅在Bash中是不可能的,但是确实显示了使用netcat或perl从命令行执行此操作的方法。例如,您可以使用netcat执行以下操作:nc -l -p <port> -c "tail -F /var/log/blah"


小智 5

在受监控的应用程序端,有一种方法可以使用 netcat 将两个输出重定向到出站连接:

$ ./application 2>&1 | nc <remote-host> <remote-port>

这样,您将重定向stderrstdoutnetcat,然后通过管道将其全部传输到 netcat,它将负责设置套接字、与远程主机建立连接等等。

但是,请记住printf(),如果这是您用来写入stdout. 在我的本地测试中,我已经看到stderr应用程序发送到的数据会在另一个侦听端立即看到,但另一方面,发送到的数据stdout仅在应用程序退出或缓冲区中有足够数据时才会发送一次全部冲洗干净。因此,如果您关心监控端的信息的顺序和可用性,我建议您fflush(stdout);在打印一些有趣stdout的内容时调用 ,或者替换调用printf()fprintf()等等write(), 不缓冲。缺点是你必须接触应用程序的代码,当然,但我不知道有什么方法可以从外部强制刷新应用程序的输出缓冲区(即来自 bash)。