我正在使用usr/bin/time
程序构建一个脚本来监视脚本的 RAM 使用情况并将其存储在变量中,以便我可以检查它是否高于指定的限制$mlimit
,就像使用以下ls /
命令的示例一样:
$mlimit=512000 #512mb limit in kilobytes
$musage=$(/usr/bin/time -f "%M" ls / | rev | cut -f 1 | rev)
echo "RAM usage: $musage"
/usr/bin/time
在这种情况下,首先返回命令的输出,然后返回最大驻留集大小(RAM 使用情况)。我想然后我可以反转输出,剪切它以获得内存使用情况并将其反转回来。但我得到这个输出:RAM usage: bin
。bin
是命令返回的第一个目录ls /
。所以我获取 RAM 使用情况的策略不起作用。
谢谢
答案1
GNUtime
在 stderr 上输出资源使用信息,但可以被告知将其写入其他地方-o
{
musage=$(command time -o /dev/fd/4 -f %M ls / 4>&1 >&3 3>&-)
} 3>&1
将记录变量中的最大内存使用量,同时保留ls
“stdout”和“stderr”。
其工作原理是在命令替换之外将原始 fd 1 (stdout) 复制到 fd 3 3>&1
,以便在命令替换内部,我们可以在命令替换管道在 fd 4 上可用后恢复ls
with的原始 stdout。>&3
然后time
通过 将其输出写入该管道/dev/fd/4
,而ls
stdout 是原始输出。