miércoles, octubre 23, 2019

Tip. Depurando un script de Bash

En todo proceso de programación, contar con un método que permita realizar la depuración del código fuente es siempre una herramienta fundamental.

También resulta útil cuando se está trabajando con scripts de Bash de otras personas y no se tiene del todo claro que es lo que hace.

Bash proporciona opciones que permiten depurar scripts.

Una forma es, al momento de correr nuestro script:

$ bash -x ./script.s

Otra alternativa es incluir set -x dentro de script para que se obtenga una salida.

Para tener un archivo de salida numerado con el seguimiento de una ejecución del script, hay que agregar las siguientes líneas.

exec 5> archivo_salida_depuracion.txt
BASH_XTRACEFD="5"
PS4='$LINENO: '  # Permite numerar las líneas de salida.
set -x    # Comienza el proceso de depuración.


sábado, octubre 05, 2019

Graficándo tiempos con gnuplot

Del experimento de la entrada anterior tengo un archivo con los tiempos de pared del programa de interés, cuyos renglones tienen una forma semejante a la siguiente:

real 75m20.477s
user 75m20.464s
sys 0m0.300s

del cual solo me interesan los renglones con la etiqueta "real".

Necesito recuperar solo esos renglones y enumerarlos para hacer la gráfica que me interesa. Para ello con grep, cut y nl tendré la tabla que me interesa graficar.

  grep real tiempos.lfs.8e3.txt | cut -c6-20 | nl > archivo.data.graf.txt

El archivo resultante tiene renglones semejantes a esto:

    10 75m20.477s

que de esta forma se puede usar en gnuplot.

Desde gnuplot es necesario indicar que formato usar para interpretar los datos, en este caso que entienda que la segunda columna son datos de tiempo.

Cómo solo me interesa ver los datos graficados, uso solo dos sentencias:

gnuplot> set timefmt "%mm%ss"
gnuplot> plot "./archivo.data.graf.txt" using 1:2 t "Tiempos de pared"

Quedando la agráfica siguiente:

Por qué necesito crear métricas

En un cierto caso, necesito generar métricas de comportamiento de un programa en particular. Y el comando time me es muy conveniente.

Pero como siempre olvido como hacerlo, dejo esto por acá como futura referencia.

Para fines del experimento, necesito repetir la ejecución de un programa n veces, pero medir el tiempo de cada una de esas ejecuciones y adicionalmente, para después hacer un poco de estadísitca básica, guardar los tiempos de pared de cada ejecución.

Así, la ejecución completa queda:

for i in {1..10}
do
 echo "Incia"
 (time ./programa) >> salida.programa.txt 2>> tiempos.programa.txt
 echo "Termina"
done

Etiquetas: