我想将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)。