每隔几秒仅从 free 命令获取已使用的内存

每隔几秒仅从 free 命令获取已使用的内存

例如在这里进行了解释:

从 free -m 命令获取单独的已用内存信息

如何剪切free命令的输出。但我想每隔几秒钟执行一次并将其记录到文件中。所以我尝试:

free -g -s2 | sed -n 's/^Mem:\s\+[0-9]\+\s\+\([0-9]\+\)\s.\+/\1/p' >> memory2.log

但文件仍为空。为什么会这样以及如何解决?

答案1

发生这种情况是因为据我所知,sed首先缓冲输入,这意味着命令不会结束,因此它不会到达附加的部分(>>)。要解决此问题,只需使用-u/--unbuffered标志sed

free -g -s2 | sed -u -n 's/^Mem:\s\+[0-9]\+\s\+\([0-9]\+\)\s.\+/\1/p' >> memory2.log

其他解决方案是使用while循环:

while true; do free -g | sed -n 's/^Mem:\s\+[0-9]\+\s\+\([0-9]\+\)\s.\+/\1/p'; sleep 1; done >> memory2.log

希望有帮助:)

答案2

我会使用 awk 来形成一个更简单的命令。 Awk 也使用输出缓冲,但mawk我的 Ubuntu 桌面上支持使用行缓冲的选项:

free -g -s2 | awk -W interactive '/^Mem:/ {print $2}'

(注意:在我的计算机上,通过 Debian 替代子系统awk链接到)mawk

如果您要运行一个 shell 循环来调用,free | awk那么它就会变成非常简单命令:

while true; do
  free -g | awk '/^Mem:/ {print $2}' >> /path/to/memory2.log
  sleep 2
done

相关内容