【问题标题】:flush output in Bourne ShellBourne Shell 中的刷新输出
【发布时间】:2009-03-04 11:27:28
【问题描述】:

我在 Upstart 脚本中使用 echo 来记录:

script
    echo "main: some data" >> log
end script

post-start script
    echo "post-start: another data" >> log
end script

现在这两个是并行运行的,所以在我经常看到的日志中:

main: post-start: some data another data

这并不重要,所以我不会采用适当的同步,但我想我会打开自动刷新以至少减少这种影响。有没有简单的方法可以做到这一点?

更新:是的,冲洗不会正确修复它,但我已经看到它在一定程度上有助于这种情况,这就是我在这种情况下所需要的。只是不知道在Shell里怎么弄

【问题讨论】:

  • 我不知道自动刷新如何帮助您。
  • 自动刷新对您没有帮助。日志实际上是两次传达“某些数据”,还是第二次实际上是“相同的数据”?
  • 2 tinkertim:不,这是不同的“一些数据”。我更新了问题

标签: linux shell upstart


【解决方案1】:

尝试改变:

回显“文本”

收件人:

【讨论】:

  • 我怀疑他们可能会写不同的东西(不同的缓冲区大小等),它对我有用。当然,如果不进行某种锁定,您无法完全解决问题,但是写入方法的选择可能会使其不那么明显。
  • 我想这是真的。 echo 是一个内置命令,所以它会缓存,当 cat 是可执行文件时,它会在退出时刷新。谢谢
【解决方案2】:

我通常使用尾随|grep -F --line-buffered '' 作为一种廉价且可靠的方式来强制行缓冲。还有来自 moreutilssponge 延迟所有输出,直到输入完成并关闭。

【讨论】:

    【解决方案3】:

    您为什么认为冲洗会有所帮助? echo 完成的写入包含换行符,因此如果第一个脚本在第二个脚本之前运行完成,则换行符已经在那里。

    在输出中它不是,这表明第二个脚本在第一个脚本完成之前运行,因此交错了它们的输出。

    刷新对此无济于事,这是一种“适当的”并行竞争条件。

    【讨论】:

    • 刷新不会完全解决这个问题,但会使写入模式稍微原子化,这将降低发生这种情况的可能性。我并没有真正给出确切的输出或确切的命令,所以请不要过分依赖它们。实际输出不同。
    猜你喜欢
    • 1970-01-01
    • 2015-05-28
    • 1970-01-01
    • 1970-01-01
    • 2011-01-13
    • 2011-01-07
    • 2014-04-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多