tutorial script comando linux bash shell

script - shell linux



Obtener el tiempo de ejecuciĆ³n del programa en el shell. (9)

El camino es

$ > g++ -lpthread perform.c -o per $ > time ./per

la salida es >>

real 0m0.014s user 0m0.010s sys 0m0.002s

Quiero ejecutar algo en un shell de Linux en unas condiciones diferentes, y poder generar el tiempo de ejecución de cada ejecución.

Sé que podría escribir un script en perl o python que haría esto, pero ¿hay alguna manera de hacerlo en la shell? (que pasa a ser bash)


Para una medición delta línea por línea, pruebe gnomon .

Una utilidad de línea de comandos, un poco como ts de moreutils, para anteponer información de marca de tiempo a la salida estándar de otro comando. Útil para procesos de larga ejecución donde le gustaría tener un registro histórico de lo que está tomando tanto tiempo.

También puede usar las --high y / o - --medium para especificar un umbral de longitud en segundos, sobre el cual gnomon destacará la marca de tiempo en rojo o amarillo. Y también puedes hacer algunas otras cosas.


Puede obtener información mucho más detallada que el tiempo incorporado en bash (que menciona Robert Gamble) usando time(1) . Normalmente esto es /usr/bin/time .

Nota del editor: para asegurarse de que está invocando el time utilidad externo en lugar de la palabra clave de time de su shell, invóquelo como /usr/bin/time .
time es una utilidad obligatoria de POSIX , pero la única opción que se requiere para admitir es -p .
Las plataformas específicas implementan extensiones no estándar específicas: -v trabaja con la utilidad de time GNU , como se muestra a continuación (la pregunta está etiquetada como linux ); La implementación de BSD / macOS usa -l para producir un resultado similar - vea man 1 time .

Ejemplo de salida verbosa:

$ /usr/bin/time -v sleep 1 Command being timed: "sleep 1" User time (seconds): 0.00 System time (seconds): 0.00 Percent of CPU this job got: 1% Elapsed (wall clock) time (h:mm:ss or m:ss): 0:01.05 Average shared text size (kbytes): 0 Average unshared data size (kbytes): 0 Average stack size (kbytes): 0 Average total size (kbytes): 0 Maximum resident set size (kbytes): 0 Average resident set size (kbytes): 0 Major (requiring I/O) page faults: 0 Minor (reclaiming a frame) page faults: 210 Voluntary context switches: 2 Involuntary context switches: 1 Swaps: 0 File system inputs: 0 File system outputs: 0 Socket messages sent: 0 Socket messages received: 0 Signals delivered: 0 Page size (bytes): 4096 Exit status: 0


Puedes usar time y subshell () :

time ( for (( i=1; i<10000; i++ )); do echo 1 >/dev/null done )

O en la misma concha {} :

time { for (( i=1; i<10000; i++ )); do echo 1 >/dev/null done }


Si desea más precisión, use %N con date (y use bc para la diferencia, porque $(()) solo maneja números enteros).

Aquí está cómo hacerlo:

start=$(date +%s.%N) # do some stuff here dur=$(echo "$(date +%s.%N) - $start" | bc) printf "Execution time: %.6f seconds" $dur

Ejemplo:

start=$(date +%s.%N); / sleep 0.1s; / dur=$(echo "$(date +%s.%N) - $start" | bc); / printf "Execution time: %.6f seconds/n" $dur

Resultado:

Execution time: 0.104623 seconds


Si pretende utilizar los tiempos posteriores para calcular, aprenda cómo usar la opción -f de /usr/bin/time para generar el código que ahorra tiempo. Aquí hay un código que utilicé recientemente para obtener y ordenar los tiempos de ejecución de una clase completa de programas para estudiantes:

fmt="run { date = ''$(date)'', user = ''$who'', test = ''$test'', host = ''$(hostname)'', times = { user = %U, system = %S, elapsed = %e } }" /usr/bin/time -f "$fmt" -o $timefile command args...

Más tarde concatené todos los archivos $timefile y $timefile la salida a un intérprete Lua . Puedes hacer lo mismo con Python o bash o cualquiera que sea tu sintaxis favorita. Me encanta esta técnica.


Si solo necesita precisión para el segundo, puede usar la variable $SECONDS incorporada, que cuenta la cantidad de segundos que el shell ha estado ejecutándose.

while true; do start=$SECONDS some_long_running_command duration=$(( SECONDS - start )) echo "This run took $duration seconds" if some_condition; then break; fi done


Utilice la palabra clave de time incorporada:

$ help time time: time [-p] PIPELINE Execute PIPELINE and print a summary of the real time, user CPU time, and system CPU time spent executing PIPELINE when it terminates. The return status is the return status of PIPELINE. The `-p'' option prints the timing summary in a slightly different format. This uses the value of the TIMEFORMAT variable as the output format.

Ejemplo:

$ time sleep 2

real 0m2.009s user 0m0.000s sys 0m0.004s


#!/bin/bash START=$(date +%s) # do something # start your script work here ls -R /etc > /tmp/x rm -f /tmp/x # your logic ends here END=$(date +%s) DIFF=$(( $END - $START )) echo "It took $DIFF seconds"