【发布时间】:2012-02-10 21:36:01
【问题描述】:
在将问题标记为重复之前,请阅读我遇到的各种问题。
一些背景知识:我们正在使用 debian linux 的 lite 变体开发在嵌入式 ARM sbc 上运行的 C++ 应用程序。应用程序在启动时由启动脚本启动,并将各种信息打印到标准输出。我们想要的是能够使用 SSH/Telnet 进行连接并读取应用程序输出,而不必为当前的 bash 会话终止进程并重新启动它。我想创建一个简单的 .sh 脚本供非技术人员使用。
此处发布的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),它在多个管道方面存在一些问题。该错误给我带来了不好的结果。例如,如果我只执行 grep 它可以工作,如果我只执行 cut 它也可以工作,但是假设 "grep "write(1," | cut -c11-60" 什么都不返回。
我知道真正的解决方案只是更新busybox并使用这些多个管道来格式化字符串,但我们无法更新它,因为操作系统分发已经安装在发送给我们全球客户的数千块板上..
谁有神奇的解决方案?谢谢
【问题讨论】:
-
您的“精简版”Linux 是否带有“屏幕”程序,或者您可以为它构建屏幕?
-
屏幕不存在,但可能很容易构建。看起来它可以很好地工作,但我不喜欢这样一个事实,即与 strace 不同,screen 必须是应用程序的父进程,并且不能只连接到已经运行的进程。