【问题标题】:Strange steam updater behaivour with pipes管道的奇怪蒸汽更新器行为
【发布时间】:2012-11-11 21:34:58
【问题描述】:

这个程序的 STDOUT 有一个奇怪的行为。

如果我执行程序: ./steam -command update -game "Counter-Strike Source" -dir . 输出下一个:

Checking bootstrapper version ...
Updating Installation
Determining which depot(s) to install/update...
5 depot(s) will be installed/updated
  0:02 Checking local files and building download list for depot 242 'Counter-Strike Source Shared' version 129
  0:02     Connecting content server session for version 129
  0:03     [80.239.194.162:27030] Connecting...
  0:06     [80.239.194.162:27030] Failed.  Failed to connect to 80.239.194.162:27030, errno 115 "Operation now in progress"
  0:06     [81.171.68.195:27030] Connecting...
  0:07     [81.171.68.195:27030] Connection established; handshaking...
  0:08     [81.171.68.195:27030] Sending login message...
  0:08     Fetching version 129 manifest
  ...

如果我使用管道和 tee 以这种方式将其记录到文件中,出于任何奇怪的原因:./steam -command update -game "Counter-Strike Source" -dir . | tee log 唯一输出程序的是:

Checking bootstrapper version ...
Updating Installation
Determining which depot(s) to install/update...
5 depot(s) will be installed/updated

仅此而已。相同的文本在日志文件和屏幕上。程序仍然开始更新文件。知道为什么会这样吗?

注意:缺少的行不是来自 STDERR

注意2:./steam 不会创建任何子进程或额外进程

【问题讨论】:

    标签: linux bash pipe steam


    【解决方案1】:

    我猜程序正在检查isatty(3) 以决定是否显示进度输出。如果是这种情况,那么如果您确实将其捕获到文件中,您可能不会得到非常合理的输出,因为它可能使用各种控制字符来使输出更加人性化。

    您可以尝试在程序连接到 TTY 时捕获程序的输出,方法是运行:

    script -c "./steam -command update ..." logfile
    

    【讨论】:

      【解决方案2】:

      tee 有双重用途——它从标准输入读取并将输出写入指定文件及其标准输出。结果,您最终会在终端上看到写入日志文件的所有内容,因为没有什么可以“吸收”来自tee 的输出。

      如果您只想将所有输出写入文件,请改用输出重定向:

      ./steam [args...] >> log
      

      要包括标准错误:

      ./steam [args...] 2>&1 >> log
      

      【讨论】:

      • 我想过,但也没有用。要知道这些行是否来自 STDERR,我使用steam [options] 2>/dev/null 取出了 STDERR。但是“检查本地文件”等仍然输出
      • 请学习在您的主要问题中包含此类有价值的调试信息。一旦你得到超过 2 个答案,每个答案有 4 个 cmets,任何试图帮助你的人都必须阅读大量内容才能找到这条重要的信息。为了帮助您解决问题,我的猜测是./stream 的某个子进程或远程进程正在生成该输出。因为我没有反恐精英,所以我没有办法测试这个理论。祝你好运。
      • @shellter 谢谢,但遗憾的是没有任何额外的 ./steam 进程。我已经用这个细节更新了问题
      • 听起来很疯狂(也许壳头会纠正我这样的事情是不可能的),但一个简单的尝试是3>&1,然后是4>&1,....等看看./stream 是否正在写入一个额外的文件句柄。 (当然,根据我之前的评论,在你原来的问题中包含这些信息;-))。祝你好运。
      猜你喜欢
      • 2018-04-11
      • 1970-01-01
      • 2020-10-17
      • 1970-01-01
      • 2019-09-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多