当脚本运行程序时,stdout会发生什么?

时间:2012-09-27 23:41:11

标签: linux embedded-linux

我有一个嵌入式应用程序,我想要一个简单的记录器。

系统从脚本文件开始,脚本文件又运行应用程序。可能有多种原因导致脚本无法运行应用程序,或者应用程序本身无法启动。要远程诊断,我需要从脚本和应用程序中查看stdout。

我尝试编写一个类似tee的记录器,它将stdin重复到stdout,并将文本保存在FIFO中,以便以后通过网络检索。然后我天真地尝试了

./script | ./logger  

我最终只有脚本stdout进入记录器,应用程序stdout消失了。尝试发球时有类似的结果。

系统正在运行内核2.4.26和busybox。

发生了什么,我怎样才能实现我想要的目标?

2 个答案:

答案 0 :(得分:4)

事实证明它完全像我认为的那样工作,只有一个小问题。 stdout正在被缓冲,没有任何fflush(stdout)命令,我从未见过它。如果我真的很耐心,当stdout缓冲区填满时,我会突然看到一大堆输出。对setlinebuf(3)的调用解决了我的问题。

答案 1 :(得分:0)

显然,应用程序输出不会以stdout结束......

  1. 输出实际上是在stderr上(通常连接到终端)

       ./script.sh 2>&1 | ./logger
    

    然后应该工作

  2. 应用程序主动断开与stdin / stdout的连接(例如,通过关闭/重新打开文件描述符0,1(,2)或使用nohupexec或类似实用程序)

  3. 脚本守护进程(也与所有标准流分离)