我正在尝试编写一个命令,通过管道传输自由的命令(每秒运行一次)转换为 awk 命令,该命令解析特定值(可用空闲内存)并将其输出到带有时间戳的文件。以下是我当前尝试执行的命令:
free -mto -s 1 | awk '/Mem/ { print strftime("%r") "," $4 }' >>memOut
或者,在谷歌搜索后
free -mto -s 1 | awk '/Mem/ { print strftime("%r") "," $4 >>"memOut"}'
每次运行都会生成空文件。有什么建议或可能的其他方法吗?
答案1
您必须刷新缓冲区才能memOut
在执行过程中看到某些内容:
free -mto -s 1 | awk '/Mem/ { print strftime("%r") "," $4; fflush(stdout) }' >> memOut
以下是另一个版本:
while sleep 1; do sed -n "s/MemFree: */`date`, /p" /proc/meminfo; done >> memOut
答案2
对于旧版本,awk
您可能必须使用system("")
。
实际上,fflush(stdout)
仅适用于awk
和的最新版本gawk
,因为它自 2012 年 12 月起才符合 POSIX 标准。
free -mto -s 1 | awk '/Mem/ {
print strftime("%r") "," $4;
system(""); # Flush output
}' >> memOut
注意使用system("")
刷新每个文件描述符,其详细描述gawk
在手册中,“9.1.4 输入/输出功能”一节中。
答案3
在某些版本awk
(例如 mawk 1.3.3)中,您需要添加-W interactive
命令行标志以启用管道的非缓冲操作。
答案4
只是为了确保你得到你真正想要的东西想而不是您具体询问的。
如果您想知道系统中可用于程序的内存,那么这可能更合适:
free -m -s 1 | awk '/buffers\/cache/ { print strftime("%r") "," $4; fflush(stdout) }' >> memOut
内存行的已用列包括缓存和缓冲区,在大多数情况下,当您想要监视给定计算机/任务的内存使用情况时,至少应该注意这些。