0

在将问题标记为重复之前,请阅读我遇到的各种问题。

一点背景知识:我们正在使用 debian linux 的 lite 变体开发在嵌入式 ARM sbc 上运行的 C++ 应用程序。应用程序在启动时由启动脚本启动,并将各种信息打印到标准输出。我们想要的是能够使用 SSH/Telnet 进行连接并读取应用程序输出,而不必为当前的 bash 会话终止进程并重新启动它。我想创建一个简单的 .sh 脚本供非技术人员使用。

此处发布的类似问题的第一个解决方案是使用 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),它在多个管道方面存在一些问题。该错误给我带来了不好的结果。例如,如果我只做 grep 它可以工作,如果我只做 cut 它也可以工作,但是让我们说 "grep "write(1," | cut -c11-60" 什么都不返回。

我知道真正的解决方案只是更新busybox并使用这些多个管道来格式化字符串,但我们无法更新它,因为操作系统分发已经安装在发送给我们全球客户的数千块板上。.

谁有神奇的解决方案?谢谢

4

1 回答 1

0

Screen 可以使用 reptyr (http://blog.nelhage.com/2011/01/reptyr-attach-a-running-process-to-a-new-terminal/) 连接到现有进程,也可以使用 neercs (http://caca.zoy.org/wiki/neercs),我没有使用过,但显然就像屏幕,但支持单独附加到现有进程。

于 2012-02-14T03:33:56.857 回答