2012-02-10 128 views
0

在将问题标记为重复之前,请阅读我遇到的各种问题。一点背景:我们正在开发一个运行在嵌入式ARM sbc上的C++应用程序,使用debian linux的一个精简版变体。应用程序从启动脚本启动时开始启动,并将各种信息输出到stdout。我们希望能够使用SSH/Telnet进行连接并读取应用程序输出,而无需终止进程并重新启动当前bash会话。我想为非技术型人士创建一个简单的.sh脚本。从一个进程读取标准输出(linux嵌入式)

这里发布的similar question的第一个解决方案是使用gdb。首先它不是用户友好的(需要手动编写多个命令),我不知道为什么,但似乎没有输出任何东西到文件中。

第二个解决方案strace -ewrite -p PID完美地工作,这就是我想要的。问题是,比标准输出有更多的信息,并且格式不正确。

我设法得到一个“可接受”的结果strace -e write=1 -s 1024 -p 20049 2>&1 | grep "write(1,"但它仍然有多余的write(1, "...", 19) = 19文本。到目前为止,这只是一些字符串格式化,我在其他页面上发现这条线表示它实现了很好的格式化:strace -ff -e write=1,2 -s 1024 -p PID 2>&1 | grep "^ |" | cut -c11-60 | sed -e 's/ //g' | xxd -r -p

在这个命令中有一些东西我觉得奇怪(为什么-ff ?,为什么grep“^ |”?,为什么在那里使用xxd?),并且它只是在我尝试时不输出任何东西。

不幸的是,我们确实使用了busybox(1.7.1)的老bug版本,它有多个管道的问题。该错误给我带来不好的结果。例如,如果我只做grep,它的工作原理,如果我只切断它也行,但我们说“grep”写(1,“| cut -c11-60”什么都不返回。解决方案只是更新busybox并使用这些多个管道来格式化字符串,但我们无法更新它,因为os发行版已经安装在运往我们全球客户的数千块主板上..

任何人都有奇迹解决方案?谢谢

+0

您的“lite”Linux是否带有程序“屏幕”,或者您可以为其构建屏幕? – 2012-02-11 02:00:36

+0

屏幕不存在,但可能很容易构建。似乎它可以很好地工作,但我不喜欢与strace不同的事实,屏幕必须是应用程序的父进程,并且不能只连接到已经运行的应用程序。 – Dunge 2012-02-13 14:42:12

回答

0

屏幕可以使用reptyr连接到现有进程(http://blog.nelhage.com/2011/01/reptyr-attach-a-running-process-to-a-new-terminal/ ),或者你可以使用neercs(http://caca.zoy.org/wiki/neercs)使用但显然是像屏幕,但支持附加到现有的过程本身。

相关问题