在将问题标记为重复之前,请阅读我遇到的各种问题。
一点背景知识:我们正在使用 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并使用这些多个管道来格式化字符串,但我们无法更新它,因为操作系统分发已经安装在发送给我们全球客户的数千块板上。.
谁有神奇的解决方案?谢谢