我有一个嵌入式应用程序,我想要一个简单的记录器。
系统从脚本文件开始,脚本文件又运行应用程序。可能有多种原因导致脚本无法运行应用程序,或者应用程序本身无法启动。要远程诊断,我需要从脚本和应用程序中查看stdout。
我尝试编写一个类似tee的记录器,它将stdin重复到stdout,并将文本保存在FIFO中,以便以后通过网络检索。然后我天真地尝试了
./script | ./logger
我最终只有脚本stdout进入记录器,应用程序stdout消失了。尝试发球时有类似的结果。
系统正在运行内核2.4.26和busybox。
发生了什么,我怎样才能实现我想要的目标?
答案 0 :(得分:4)
事实证明它完全像我认为的那样工作,只有一个小问题。 stdout正在被缓冲,没有任何fflush(stdout)命令,我从未见过它。如果我真的很耐心,当stdout缓冲区填满时,我会突然看到一大堆输出。对setlinebuf(3)的调用解决了我的问题。
答案 1 :(得分:0)
显然,应用程序输出不会以stdout结束......
输出实际上是在stderr上(通常也连接到终端)
./script.sh 2>&1 | ./logger
然后应该工作
应用程序主动断开与stdin / stdout的连接(例如,通过关闭/重新打开文件描述符0,1(,2)或使用nohup
,exec
或类似实用程序)
脚本守护进程(也与所有标准流分离)