![/usr/bin/time でメモリのピーク使用量のみを取得するにはどうすればよいですか?](https://rvso.com/image/192252/%2Fusr%2Fbin%2Ftime%20%E3%81%A7%E3%83%A1%E3%83%A2%E3%83%AA%E3%81%AE%E3%83%94%E3%83%BC%E3%82%AF%E4%BD%BF%E7%94%A8%E9%87%8F%E3%81%AE%E3%81%BF%E3%82%92%E5%8F%96%E5%BE%97%E3%81%99%E3%82%8B%E3%81%AB%E3%81%AF%E3%81%A9%E3%81%86%E3%81%99%E3%82%8C%E3%81%B0%E3%82%88%E3%81%84%E3%81%A7%E3%81%99%E3%81%8B%3F.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 使用量を取得し、それを元に戻すことができると考えました。しかし、次の出力が返されます: RAM usage: bin
.は、コマンドbin
によって返される最初のディレクトリですls /
。したがって、RAM 使用量を取得するための私の戦略は機能していません。
ありがとう
答え1
GNUはtime
リソース使用情報を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 に複製することで機能します。これにより、コマンド置換の内部では、コマンド置換パイプを fd 4 で使用できるようにした後、3>&1
の元の stdout を復元できます。ls
>&3
次に、time
を介してそのパイプに出力を書き込みます/dev/fd/4
。stdoutls
は元の出力です。