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 time
después de bash -x
recibir un error:
/usr/bin/time: /usr/bin/time: cannot execute binary file
Si intento usarlo, acct
no parece registrar el proceso o no puedo encontrarlo.
Respuesta1
[esto supone que desea que la salida de time
también vaya a log.txt
, algo que no queda claro en su pregunta]
Simplemente no lo uses nohup
.
nohup
no hace nada especial más que ignorar la SIGHUP
señal, redirigir stdout y stderr a un archivo y, solo en algunas variantes, como nohup
GNU coreutils, redirigir la entrada estándar desde /dev/null
abierta 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/null
si 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 time
el nohup
proceso:
$ 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.sh
simplemente tiene sleep 10
como 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..."