![¿Cómo obtener solo el uso máximo de memoria con /usr/bin/time?](https://rvso.com/image/192252/%C2%BFC%C3%B3mo%20obtener%20solo%20el%20uso%20m%C3%A1ximo%20de%20memoria%20con%20%2Fusr%2Fbin%2Ftime%3F.png)
Estoy creando un script con usr/bin/time
un programa para monitorear el uso de RAM de un script y almacenándolo en una variable para poder verificar si es superior a un límite especificado $mlimit
, como este ejemplo usando ls /
como comando:
$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
en este caso, devuelve primero la salida del comando y luego el tamaño máximo del conjunto residente (uso de RAM). Entonces pensé que podría revertir la salida, cortarla para obtener el uso de RAM y revertirla. Pero obtengo este resultado: RAM usage: bin
. bin
es el primer directorio devuelto por el ls /
comando. Entonces mi estrategia para aprovechar el uso de RAM no funciona.
Gracias
Respuesta1
GNU time
genera la información de uso de recursos en stderr, aunque se le puede indicar que la escriba en otro lugar con-o
{
musage=$(command time -o /dev/fd/4 -f %M ls / 4>&1 >&3 3>&-)
} 3>&1
Registraría el uso máximo de memoria en la variable dejando ls
'stdout y stderr solos.
Eso funciona duplicando el fd 1 (stdout) original en fd 3 fuera de la sustitución del comando con 3>&1
, de modo que dentro de la sustitución del comando, podamos restaurar la salida estándar original ls
con >&3
después de haber hecho que la canalización de sustitución de comandos esté disponible en fd 4.
Luego time
escribe su salida en esa tubería a través de /dev/fd/4
, mientras que ls
stdout es la original.