![如何透過 /usr/bin/time 取得記憶體峰值使用情況?](https://rvso.com/image/192252/%E5%A6%82%E4%BD%95%E9%80%8F%E9%81%8E%20%2Fusr%2Fbin%2Ftime%20%E5%8F%96%E5%BE%97%E8%A8%98%E6%86%B6%E9%AB%94%E5%B3%B0%E5%80%BC%E4%BD%BF%E7%94%A8%E6%83%85%E6%B3%81%EF%BC%9F.png)
我正在使用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 是原始輸出。