Registrar el tiempo de ejecución del trabajo en segundo plano

Registrar el tiempo de ejecución del trabajo en segundo plano

Tengo un script que ejecuto en segundo plano y capturo todos los resultados con un comando como este:

nohup bash -x test.sh < /dev/null > log.txt 2>&1 &

¿Cómo puedo saber cuánto tiempo tardó en completarse? Si intento usarlo timedespués de bash -xrecibir un error:

/usr/bin/time: /usr/bin/time: cannot execute binary file

Si intento usarlo, acctno parece registrar el proceso o no puedo encontrarlo.

Respuesta1

[esto supone que desea que la salida de timetambién vaya a log.txt, algo que no queda claro en su pregunta]

Simplemente no lo uses nohup.

nohupno hace nada especial más que ignorar la SIGHUPseñal, redirigir stdout y stderr a un archivo y, solo en algunas variantes, como nohupGNU coreutils, redirigir la entrada estándar desde /dev/nullabierta enescribir solamentemodo.

Puedes hacer todo eso fácilmente desde el shell:

{ trap '' HUP; time bash -x your_script args ... ; } > log.txt 2>&1 0>/dev/null &

O más seguro, si se inicia desde un script o si no planea volver a poner el comando en primer plano con fg:

(trap '' HUP; time bash -x your_script args ... 0>/dev/null &) > log.txt 2>&1

(Puedes omitirlo 0>/dev/nullsi no te interesa emular esa característica de GNU nohup).


Por supuesto, también puedes usar el truco de sintaxis del primer ejemplo con nohup si, por alguna razón insondable, le atribuyes propiedades mágicas a nohup:

{ time nohup bash -x your_script args ... ; } > log.txt 2>&1 &

Respuesta2

Sólo timeel nohupproceso:

$ time nohup bash -x ~/scripts/foo.sh 
nohup: ignoring input and appending output to 'nohup.out'

real    0m10.011s
user    0m0.005s
sys 0m0.006s

foo.shsimplemente tiene sleep 10como ejemplo.

Respuesta3

Podrías usar simplemente:

time yourscript.sh

Pero si eso no funciona para usted, puede ajustar el contenido del script de la siguiente manera:

STARTTIME=$(date +%s)
#command block that takes time to complete...
ENDTIME=$(date +%s)
echo "It takes $($ENDTIME - $STARTTIME) seconds to complete this task..."

información relacionada