【问题标题】:Redirecting iostat output to a file将 iostat 输出重定向到文件
【发布时间】:2014-03-31 01:51:15
【问题描述】:

为什么iostat的输出没有重定向到以下命令中的文件:

iostat -x 3 | awk '/sda/ { print $11, $12}' > /tmp/disk_utilization 

iostat 的行为是否与任何其他命令不同?

提前谢谢

【问题讨论】:

  • 我的 iostat 版本没有 -x 标志。否则我无法重现此问题。
  • Mac OSX 上也一样。
  • 小次郎和马克,你们如何停止 iostat? ctrl+c?您是否在文件中看到重定向到的内容?
  • @isaac.hazan 显然在 OS X 上它只打印一行,除非你告诉它轮询。所以这是一个行缓冲问题?
  • @kojiro 是的,输出被缓冲并保存在内存中,直到退出,也就是文件被输出填充的时候。

标签: bash awk iostat


【解决方案1】:

看起来您需要添加一个计数来告诉流何时终止(man iostat)。您只是添加间隔:

If the interval parameter is specified without the count parameter, the iostat command generates reports continuously. 

当我尝试时:

iostat -x 3 6 | awk '/sda/ { print $11, $12}' > outfile

6 告诉iostat 在 3 秒间隔的 6 次迭代后停止。迭代iostat 完成后,我得到一个output 文件。

或者,您可以选择一些表达式来导致 awk 脚本退出。当我尝试时:

iostat -x 3 | awk -v max=10 '/sda/ { print $11, $12; max++ } NR > max { exit } ' > outfile2

我在 output2 中只得到 3 行,这是有道理的,因为 iostat -x 产生了大约相当于屏幕的输出行。

您还可以在每个打印周期中将 awk 强制为 fflush(stdout)

iostat -x 3 | awk '/sda/ { print $11, $12; fflush(stdout) }' > output3

然后在 shell 中使用 <ctrl+c> 关闭 iostat

【讨论】:

    【解决方案2】:

    问题的原因是管道被缓冲了(可能是4k),所以如果你等待足够长的时间让输出刷新到文件中,它将不再是空的。

    【讨论】:

      猜你喜欢
      • 2016-08-09
      • 2013-10-11
      • 2023-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-03
      • 2015-08-31
      • 2013-04-21
      相关资源
      最近更新 更多