A veces, cuando se trabaja con el terminal de Linux, es necesario conocer el tiempo de ejecución de ciertos comandos, por ejemplo, para localizar problemas. Para ello existe una utilidad llamada time
. Te contaremos cómo funciona el comando time de Linux
y cuál es su sintaxis. Luego pasaremos a la descripción de las opciones disponibles. Y al final mencionaremos algunos escenarios de uso populares.
La utilidad ejecuta un comando definido por el usuario y luego muestra información sobre su tiempo de ejecución. Su sintaxis es bastante práctica. Primero hay que especificar las opciones para el tiempo
, después el comando que se va a ejecutar y, por último, los argumentos del mismo:
$ time [options] command_to_execute [arguments]
Veamos la lista de opciones disponibles:
-o
, --output
- guarda los datos en el archivo seleccionado en lugar de la salida estándar del terminal. En este caso, se sobrescribirán los datos antiguos del fichero.-a
, --append
- añadir nueva información al fichero en lugar de sobrescribir la antigua. Esta opción sólo es útil en combinación con -o
.-f
, --format
- selecciona un formato de salida específico. Los detalles sobre el formato se describen en la siguiente sección de este artículo.-p
, --profitably
- utilizar un formato de salida de datos conforme al estándar POSIX 1003.2.-v
, --verbose
- muestra información detallada sobre la ejecución del programa.-V
, --version
- muestra la versión de la utilidad de tiempo
.Esta lista sólo contiene las opciones básicas. Puede obtener información detallada con el comando:
$ man time
Por defecto, time
puede mostrar la información en un formato que no es cómodo para la lectura,
Es deseable establecer opciones de formato de salida para ello, que se discutirán ahora. Hay tres en total. Tomemos el comando apt-get update
como ejemplo.
La opción -v
se utiliza para mostrar información detallada:
$ sudo time -v apt-get update
La opción -p
es necesaria para mostrar los datos en un formato compatible con POSIX 1003.2:
$ sudo time -p apt-get update
La línea de datos de formato suele incluir especificadores de recursos y texto sin formato. El signo %
indica que el carácter que le sigue debe ser tratado como un especificador de recurso.
El signo se utiliza para especificar el carácter delimitador. Hay tres opciones disponibles:
t
- tabulador, n
- nueva línea, \
- barra invertida. Si especifica cualquier otro carácter después de , el terminal mostrará un signo de interrogación (
?
), que indica un error de entrada.
El resto del texto de la cadena de formato se copia completamente en el campo de salida. En este caso, time
siempre comienza a dar salida a los datos de una nueva línea después de la información sobre la ejecución del propio comando.
Consideremos los especificadores de recursos disponibles:
%
- literal %. es decir, para dar salida a un signo de porcentaje debe especificar %% en el comando.C
- nombre del comando y argumentos utilizados.D
- tamaño medio del área de datos no dividida. Se muestra en kilobytes.E
- tiempo real de ejecución del comando en el formato habitual de horas. Se muestra como [Horas:]<imutos:segundos
.N
- número de errores mayores o de E/S ocurridos durante la ejecución del proceso.I
- número de accesos al sistema de archivos.K
- valor medio de memoria utilizada para código(texto
), datos inicializados(datos
) ypila (pila
). Se muestra en kilobytes.M
- tamaño máximo del conjunto residente durante la ejecución del proceso en kilobytes.O
- número de salidas del sistema de archivos.P
- porcentaje de carga de la CPU (unidad central de proceso).R
- número de errores menores.S
- tiempo en segundos durante el cual la CPU fue utilizada por el sistema en nombre del proceso en modo supervisor(
modokernel
).U
- tiempo en segundos durante el cual la CPU fue utilizada por el proceso directamente en modousuario
.W
- cuantas veces el proceso fue descargado de RAM.Z
- tamaño de página del sistema. Este valor es una constante, pero varía entre sistemas.c
- número de cambios de contexto involuntarios durante la ejecución del proceso.e
- tiempo real de ejecución del comando en el formato habitual de hora. Se muestra en segundos.k
- número de señales que llegaron al proceso.p
- tamaño medio de la pila no compartida del proceso, en kilobytes.r
- número de mensajes de socket recibidos.s
- número de mensajes de socket enviados.t
- tamaño medio del conjunto residente del proceso, en kilobytes.w
- número de cambios de contexto voluntarios durante la ejecución del proceso.x
- código de retorno del comando.Estos fueron todos los especificadores de recursos utilizados al elegir el formato para el tiempo
. Ahora pasemos a los escenarios de uso del comando.
Veamos tres ejemplos básicos que se usan bastante comúnmente: salida a la terminal, salida a un archivo separado y salida con formato.
Como ejemplo tomaremos el comando sleep, que hace una pausa durante un tiempo especificado. Será un ejemplo muy claro, porque el tiempo de pausa coincidirá en el tiempo
con el tiempo de ejecución del comando:
$ time sleep 3
El tiempo se escribe inmediatamente en tres columnas. Repasemos cada una de ellas
real
- el tiempo total desde el inicio de la ejecución del proceso hasta su finalización.
user
- tiempo durante el cual el proceso se ejecutó en modousuario
.
sys
- tiempo durante el cual el proceso estuvo involucrado en modo supervisor(
modokernel
).
El siguiente escenario útil es obtener el tiempo que se tarda en cargar la cabecera de una página web mediante la utilidad curl
. Tomemos como ejemplo nuestra página web:
$ time curl -I https://losst.ru
Debemos mencionar una situación en la que la ejecución del comando pone la ventana de terminal en un modo diferente, como cuando ejecutas el editor nano para modificar el archivo /home/root-user/script.txt
:
$ time nano /home/root-user/scripts/main_script.txt
Después de que el editor termine, verás el tiempo total que trabajaste en el archivo.
Ahora ya sabes cómo ver el tiempo de ejecución de un comando Linux.
La información sobre los resultados del comando tiempo puede guardarse en un archivo separado utilizando la opción-o
. En este caso, no se mostrarán en la ventana del terminal. Tomemos el ejemplo de extraer el contenido del archivo ~/data/data.tar.gz
utilizando la utilidad tar
. Vamos a guardar la información sobre el tiempo de ejecución en un nuevo archivo ~/data/data_data_time.txt.
También añadiremos la opción-v
al comando para obtener información detallada:
$ sudo time -v -o ~/data/data_time.txt tar -xvf ~/data/data.tar.gz -C ~/data
El archivo tendrá el siguiente contenido.
Si utiliza la opción -o
, recuerde que sobrescribe la información antigua del archivo de salida con la nueva. Esto es aplicable cuando se crean archivos nuevos, pero no es adecuado para el registro. Con la opción -a, la sobreescritura del contenido se sustituye por la adición de nueva información:
$ sudo time -v -a -o ~/data/data_time.txt tar -xvf ~/data/data.tar.gz -C ~/data
La opción original de formatear los datos no es adecuada en todos los casos. Como ejemplo, tomaremos el comando utilizado anteriormente para extraer un archivo, pero no guardaremos los datos en un fichero. Al ejecutarlo, nos interesa:
especificador%C
. especificador%P
. especificador%e
.Para una percepción cómoda, cada elemento se mostrará en una línea separada utilizando el separador n
. Al mismo tiempo, todos estarán firmados de forma comprensible.
Este es el aspecto de la versión final del comando:
sudo time -f "Command info:n%CnCPU usage: %PnExecution time: %e sec" tar -xvf ~/data/data.tar.gz -C ~/data
Todo el texto excepto los caracteres después de %n
se muestra completamente en el terminal. Esta es una forma conveniente de marcar