Linux:stdout和stderr到socket

时间:2014-03-19 01:52:01

标签: c linux sockets console

我想将stdout和stderr重定向到一个套接字,然后我可以使用该套接字通过以太网远程监控我的应用程序的状态。目前我通过使用ssh并在shell控制台中观察输出来实现此目的。如果可能的话,我宁愿删除中间人,只需将整个stdout和stderr输出发送到udp或tcp / ip端口,并让我的监控计算机连接到它。

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

感谢您的帮助。

2 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:3)

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

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

这样,您可以将stderr重定向到stdout,然后将它们一起管道到netcat,这将负责设置套接字,建立与远程主机的连接以及所有那东西。

但是,请记住,如果您使用printf()写入stdout的功能,则可能会受到stderr的缓冲。在我的本地测试中,我发现应用程序发送到stdout的数据会立即在另一个侦听端看到,但另一方面,发送到fflush(stdout);的数据只会被发送当应用程序退出或缓冲区中有足够的数据来立即刷新所有数据时。因此,如果您关心监控方面信息的顺序和可用性,我建议您在stdout打印有趣的内容时拨打printf(),或者更换调用fprintf()write()等到{{1}},这不会缓冲。缺点是你必须触摸应用程序的代码,当然,但我不知道如何从外部强制刷新应用程序的输出缓冲区(即来自bash)。