2010-10-01 9 views
7

Ejecuto mi propio script para volcar bases de datos en archivos cada noche.
Quería contar el tiempo (en segundos) que tarda en volcar cada base de datos, así que estaba tratando de escribir algunas funciones para ayudarme a lograrlo, pero estoy teniendo problemas.Temporizador simple para medir los segundos que tomó una operación para completar

No soy un experto en scripts en bash, así que si lo estoy haciendo mal, simplemente dígalo e idealmente sugiera una alternativa, por favor.

Aquí está la secuencia de comandos:

#!/bin/bash 

declare -i time_start 

function get_timestamp { 
     declare -i time_curr=`date -j -f "%a %b %d %T %Z %Y" "\`date\`" "+%s"` 
     echo "get_timestamp:" $time_curr 
     return $time_curr 
} 

function timer_start { 
     get_timestamp 
     time_start=$? 
     echo "timer_start:" $time_start 
} 

function timer_stop { 
     get_timestamp 
     declare -i time_curr=$? 
     echo "timer_stop:" $time_curr 
     declare -i time_diff=$time_curr-$time_start 

     return $time_diff 
} 

timer_start 
sleep 3 
timer_stop 
echo $? 

El código debería realmente ser bastante explica por sí mismo. Los comandos echo son solo para la depuración.
espero que la salida sea algo como esto:

$ bash timer.sh 
get_timestamp: 1285945972 
timer_start: 1285945972 
get_timestamp: 1285945975 
timer_stop: 1285945975 
3 

Ahora bien, este no es el caso, lamentablemente. Lo que consigo es:

$ bash timer.sh 
get_timestamp: 1285945972 
timer_start: 116 
get_timestamp: 1285945975 
timer_stop: 119 
3 

Como se puede ver, el valor que var time_curr obtiene del comando es una marca de tiempo válida, pero devolver este valor hace que sea cambiado a un número entero entre 0 y 255.

¿Puede alguien explicarme por qué sucede esto?

PS. Obviamente, este es solo mi script de prueba del temporizador sin ninguna otra lógica.


ACTUALIZACIÓN sólo para estar perfectamente claro, yo quiero que esto sea parte de una escritura del golpe muy similar a this one, donde yo quiero medir cada ciclo del bucle.

A menos que por supuesto que puedo hacerlo con time, entonces sugiera una solución.

+2

No tiene que usar 'date' para esto. Bash tiene una variable '$ SECONDS' que se actualiza automáticamente y muestra el número de segundos desde que se inició el script (o shell). Incluso se puede configurar y aún se autoevaluará. –

+0

Dennis, esta es la solución más simple que puedo encontrar y es exactamente lo que estaba buscando. Si lo dejas como un aswer, lo aceptaré felizmente. –

+0

http://unix.stackexchange.com/questions/53841/how-to-use-a-timer-in-bash –

Respuesta

3

$? se utiliza para mantener el estado de salida de un comando y solo puede contener un valor entre 0 y 255. Si pasa un código de salida fuera de este rango (por ejemplo, en un programa C llamando al exit(-1)), el shell seguirá reciba un valor en ese rango y configure $? en consecuencia.

Como solución alternativa, sólo puede establecer un valor diferente en función de su fiesta:

function get_timestamp { 
     declare -i time_curr=`date -j -f "%a %b %d %T %Z %Y" "\`date\`" "+%s"` 
     echo "get_timestamp:" $time_curr 
     get_timestamp_return_value=$time_curr 
} 

function timer_start { 
     get_timestamp 
     #time_start=$? 
     time_start=$get_timestamp_return_value 
     echo "timer_start:" $time_start 
} 

... 
+1

Como alternativa a una variable "global", 'echo' se puede usar para" devolver "un valor. Ambas técnicas son útiles y tu elección depende de tus necesidades. –

21

No necesita hacer todo esto. Simplemente ejecute time <yourscript> en el shell.

+0

Pregunta actualizada. –

+0

Coloque los comandos que están dentro del bucle en otra secuencia de comandos, luego ejecútelo: hora other_script –

0

Creo que debería poder usar la función de "tiempo" existente.

Después de la actualización a la pregunta: Este fue el bit de script de su enlace que estaba haciendo un ciclo for.

# dump each database in turn 
for db in $databases; do 
    echo $db 
    $MYSQLDUMP --force --opt --user=$USER --password=$PASSWORD 
    --databases $db > "$OUTPUTDIR/$db.bak" 
done 

Se puede extraer la parte interna del bucle en un nuevo guión (llámese dump_one_db.sh) y hacer esto dentro del bucle:

# dump each database in turn 
    for db in $databases; do 
     time dump_one_db.sh $db 
    done 

Asegúrese de escribir la salida de las veces contra el nombre db en algún archivo.

+0

Pregunta actualizada. –

0

Esto sucede porque los códigos de retorno deben estar entre 0-255. No puedes devolver un número arbitrario. Si continúa rehusándose a usar la función integrada time y carga la suya, cambie sus funciones para que hagan eco de su sello y use una expansión de proceso ($()) para obtener el valor.

Cuestiones relacionadas