È possibile stampare il tempo di esecuzione di un comando di shell con la seguente combinazione?
root@hostname:~# "command to execute" && echo "execution time"
Risposte:
Non dimenticare che c'è una differenza tra il builtin di bash time(che dovrebbe essere chiamato di default quando lo fai time command) e /usr/bin/time(che dovrebbe richiedere di chiamarlo per il suo percorso completo).
Il builtin timestampa sempre su stderr, ma /usr/bin/timevi permetterà di inviare l'output di time a un file specifico, così non interferirete con il flusso stderr del comando eseguito. Inoltre, /usr/bin/timeil formato di è configurabile dalla riga di comando o dalla variabile d'ambiente TIME, mentre il timeformato incorporato di bash è configurato solo dalla TIMEFORMATvariabile d'ambiente.
$ time factor 1234567889234567891 # builtin
1234567889234567891: 142662263 8653780357
real 0m3.194s
user 0m1.596s
sys 0m0.004s
$ /usr/bin/time factor 1234567889234567891
1234567889234567891: 142662263 8653780357
1.54user 0.00system 0:02.69elapsed 57%CPU (0avgtext+0avgdata 0maxresident)k
0inputs+0outputs (0major+215minor)pagefaults 0swaps
$ /usr/bin/time -o timed factor 1234567889234567891 # log to file `timed`
1234567889234567891: 142662263 8653780357
$ cat timed
1.56user 0.02system 0:02.49elapsed 63%CPU (0avgtext+0avgdata 0maxresident)k
0inputs+0outputs (0major+217minor)pagefaults 0swaps
help timeperché l'ho solo guardato e ho pensato che fosse un argomento della riga di comando. Aggiornerò la risposta.
time è un comando integrato nella maggior parte delle shell che scrive le informazioni sul tempo di esecuzione nella tty.
Potresti anche provare qualcosa di simile
start_time=`date +%s`
<command-to-execute>
end_time=`date +%s`
echo execution time was `expr $end_time - $start_time` s.
Oppure in bash:
start_time=`date +%s`
<command-to-execute> && echo run time is $(expr `date +%s` - $start_time) s
timeutilizza i millisecondi. E se vuoi cronometrare una manciata di comandi insieme senza dover usare variabili e calcoli, puoi usare le parentesi: time ( command1 ; command2 ; command3 )potresti persino cronometrarli individualmente insieme al tempo totale, in questo modo: time ( time command1 ; time command2 ; time command3 ) Ovviamente, se vuoi una ventina di comandi, potresti è meglio usare la soluzione di questa risposta. Ma poi, dovresti iniziare a pensare di mettere tutti i tuoi comandi in uno script ...
root@hostname:~# time [command]
Inoltre distingue tra tempo reale utilizzato e tempo di sistema utilizzato.
timescrive su tty, non su stderr. Il che immagino che peggiori le cose.
Per una misurazione delta riga per riga, provare gnonom .
È un'utilità della riga di comando, un po 'come ts di moreutils, per anteporre le informazioni di timestamp allo standard output di un altro comando. Utile per processi di lunga durata in cui desideri una registrazione storica di ciò che impiega così tanto tempo.
Piping qualsiasi cosa a gnomon anteporrà un timestamp a ciascuna riga, indicando per quanto tempo quella riga era l'ultima riga nel buffer, ovvero quanto tempo ha impiegato la riga successiva per apparire. Per impostazione predefinita, gnomon mostrerà i secondi trascorsi tra ogni riga, ma questo è configurabile.
Se sto avviando un processo di lunga durata come una copia o un hash e voglio sapere in seguito quanto tempo ci è voluto, lo faccio semplicemente:
$ date; sha1sum reallybigfile.txt; date
Che risulterà nel seguente output:
Tue Jun 2 21:16:03 PDT 2015
5089a8e475cc41b2672982f690e5221469390bc0 reallybigfile.txt
Tue Jun 2 21:33:54 PDT 2015
Certo, come implementato qui non è molto preciso e non calcola il tempo trascorso. Ma è semplice e a volte tutto ciò di cui hai bisogno.
In zsh puoi usare
=time ...
In bash o zsh puoi usare
command time ...
Questi (con meccanismi diversi) forzano l'uso di un comando esterno.
Appena ps -o etime= -p "<your_process_pid>"
man bash: "La variabile TIMEFORMAT può essere impostata su una stringa di formato che specifica come devono essere visualizzate le informazioni sui tempi"