Как получить только пиковое использование памяти с помощью /usr/bin/time?

Как получить только пиковое использование памяти с помощью /usr/bin/time?

Я создаю скрипт с 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

Запишет максимальное использование памяти в переменную, оставив lsstdout и stderr нетронутыми.

Это работает путем дублирования исходного fd 1 (stdout) в fd 3 за пределами подстановки команд с помощью 3>&1, так что внутри подстановки команд мы можем восстановить исходный stdout для lswith >&3после того, как сделали канал подстановки команд доступным на fd 4.

Затем timeзаписывает свой вывод в этот канал через /dev/fd/4, в то время как lsstdout является исходным.

Связанный контент