Registrar o tempo de execução do trabalho em segundo plano

Registrar o tempo de execução do trabalho em segundo plano

Eu tenho um script que executo em segundo plano e capturo toda a saída com um comando como este:

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

Como posso saber quanto tempo demorou para ser concluído? Se eu tentar usar timedepois de bash -xreceber um erro:

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

Se tento usá acct-lo, parece que não registra o processo ou não consigo encontrá-lo.

Responder1

[isso pressupõe que você deseja que a saída timetambém vá para log.txt, algo que não está claro na sua pergunta]

Só não use nohup.

nohupnão faz nada de especial além de ignorar o SIGHUPsinal, redirecionando stdout e stderr para um arquivo e - apenas em algumas variantes, como o nohupdo GNU coreutils - redirecionando o stdin de /dev/nullaberto emsomente gravaçãomodo.

Você pode fazer tudo isso facilmente no shell:

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

Ou mais seguro, se iniciado a partir de um script ou se você não planeja trazer o comando de volta ao primeiro plano com fg:

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

(Você pode omitir 0>/dev/nullse não quiser emular esse recurso do GNU nohup).


Claro, você também pode usar o truque de sintaxe do primeiro exemplo com nohup se, por alguma razão incompreensível, atribuir propriedades mágicas ao nohup:

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

Responder2

Apenas timeo nohupprocesso:

$ 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.shsimplesmente tem sleep 10como exemplo.

Responder3

Você poderia simplesmente usar:

time yourscript.sh

Mas se isso não funcionar para você, você pode agrupar o conteúdo do script como:

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

informação relacionada