Linux:stdout和stderr到套接字

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

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

谢谢您的帮助。

你描述它的方式,听起来像你将需要现有的应用程序来打开一个被动的套接字,并等待连接,或者你将不得不把你的应用程序包装在一个设置监听套接字的东西。 这个帖子表明,这是不可能的只是Bash,但它确实显示了从netcat或perl的命令行的方式。 例如,你可以用netcat做这样的事情: nc -l -p <port> -c "tail -F /var/log/blah"

在受监视的应用程序端,可以使用netcat将两个输出重定向到出站连接:

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

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

但是,请记住,如果这是您用来写入stdout的函数,那么您可能会遭受printf()的缓冲。 在我的本地测试中,我看到应用程序发送到stderr的数据立即在另一个监听端看到,但另一方面,发送到stdout的数据只在应用程序退出或数据库中有足够的数据缓冲区一次冲洗。 所以,如果你关心监控端信息的顺序和可用性,我建议你将调用放到fflush(stdout); 每当你打印一些有趣的东西到stdout ,或者将调用printf()fprintf()write() ,它不会缓冲。 缺点是你必须触摸应用程序的代码,当然,但我不知道任何方式外部强制刷新应用程序的输出缓冲区(即从bash)。