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 time
depois de bash -x
receber 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 time
também vá para log.txt
, algo que não está claro na sua pergunta]
Só não use nohup
.
nohup
não faz nada de especial além de ignorar o SIGHUP
sinal, redirecionando stdout e stderr para um arquivo e - apenas em algumas variantes, como o nohup
do GNU coreutils - redirecionando o stdin de /dev/null
aberto 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/null
se 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 time
o nohup
processo:
$ 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
simplesmente tem sleep 10
como 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..."