【问题标题】:What happens to stdout when a script runs a program?当脚本运行程序时,stdout 会发生什么?
【发布时间】:2012-10-03 12:49:09
【问题描述】:

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

系统从一个脚本文件开始,然后运行应用程序。脚本无法运行应用程序可能有多种原因,或者应用程序本身可能无法启动。要远程诊断此问题,我需要从脚本和应用程序中查看标准输出。

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

./script | ./logger  

我最终只有脚本标准输出进入记录器,而应用程序标准输出消失了。我尝试 tee 也有类似的结果。

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

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

【问题讨论】:

    标签: linux embedded-linux


    【解决方案1】:

    事实证明,它的工作方式完全符合我的预期,但有一个小问题。 stdout 正在被缓冲,并且没有任何 fflush(stdout) 命令,我从未见过它。如果我真的有耐心,当标准输出缓冲区填满时,我会突然看到大量输出。调用 setlinebuf(3) 解决了我的问题。

    【讨论】:

      【解决方案2】:

      显然,应用程序的输出并没有在标准输出上结束...

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

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

        然后应该工作

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

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

      【讨论】:

      • 1.我刚试过。它没有帮助。可能有一些标准错误,但大部分输出是标准输出。 2. 我不认为我会这样做。 3. 没有守护进程。线程,是的。我没有从原始线程中看到任何内容。
      猜你喜欢
      • 2010-11-15
      • 1970-01-01
      • 1970-01-01
      • 2011-07-06
      • 2021-03-03
      • 2015-09-14
      • 1970-01-01
      • 1970-01-01
      • 2021-04-28
      相关资源
      最近更新 更多