![Как получить только пиковое использование памяти с помощью /usr/bin/time?](https://rvso.com/image/192252/%D0%9A%D0%B0%D0%BA%20%D0%BF%D0%BE%D0%BB%D1%83%D1%87%D0%B8%D1%82%D1%8C%20%D1%82%D0%BE%D0%BB%D1%8C%D0%BA%D0%BE%20%D0%BF%D0%B8%D0%BA%D0%BE%D0%B2%D0%BE%D0%B5%20%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%20%D0%BF%D0%B0%D0%BC%D1%8F%D1%82%D0%B8%20%D1%81%20%D0%BF%D0%BE%D0%BC%D0%BE%D1%89%D1%8C%D1%8E%20%2Fusr%2Fbin%2Ftime%3F.png)
Я создаю скрипт с usr/bin/time
программой для мониторинга использования оперативной памяти скриптом и сохраняю его в переменной, чтобы можно было проверить, превышает ли он указанный предел $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 usage: bin
. bin
— это первый каталог, возвращаемый командой ls /
. Так что моя стратегия получения использования ОЗУ не работает.
Спасибо
решение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 за пределами подстановки команд с помощью 3>&1
, так что внутри подстановки команд мы можем восстановить исходный stdout для ls
with >&3
после того, как сделали канал подстановки команд доступным на fd 4.
Затем time
записывает свой вывод в этот канал через /dev/fd/4
, в то время как ls
stdout является исходным.