Ho uno script bash
che richiede circa 5 secondi per essere eseguito. Mi piacerebbe eseguirne il debug e determinare quali comandi impiegano più tempo. Qual è il modo migliore per fare questo? C'è una bandiera che posso impostare? L'impostazione #!/bin/bash -vx
non è di grande aiuto. Quello che voglio è fondamentalmente il tempo di esecuzione per numero di riga.Come eseguire il debug di uno script di bash e ottenere il tempo di esecuzione per comando
risposta
È possibile utilizzare set -x
affinché lo script stampi ogni comando prima che venga eseguito. Non conosco un modo per ottenere automaticamente i tempi di comando aggiunti. È possibile cospargere i comandi date
in tutto lo script per contrassegnare l'ora.
È possibile utilizzare l'utilità time
per misurare il tempo di esecuzione dei singoli comandi/funzioni.
Ad esempio:
[[email protected] ~]$ cat times.sh
#!/bin/bash
test_func()
{
sleep 1
echo "test"
}
echo "Running test_func()"
time test_func
echo "Running a 5 second external command"
time sleep 5
esecuzione che i risultati dello script in qualcosa di simile al seguente:
[[email protected] ~]$ ./times.sh
Running test_func()
test
real 0m1.003s
user 0m0.001s
sys 0m0.001s
Running a 5 second external command
real 0m5.002s
user 0m0.001s
sys 0m0.001s
non utilizzare 'test' come nome funzione. È un built-in di shell. rinominalo in 'test_time' o qualcosa del genere ... – anishsane
Grazie per il commento. Fisso. – Ben
Un nitpick: 'time' è di default una _shell keyword_ (anche se esiste come utility esterna,'/usr/bin/time'). Solo la parola chiave shell è in grado di misurare comandi shell arbitrari _come un intero_ (confronta l'output da 'time ls | sleep 1' a'/usr/bin/time ls | sleep 1'). – mklement0
Prova questo:
sed 's/^\([^#]\)/time \1/' script.sh>tmp.sh && ./tmp.sh
si antepone un comando di tempo per tutti i non righe di comando
Questo è il più vicino possibile risposta con built-in funzione di debug di bash in quanto fornisce informazioni di tempistica complessiva dal momento di inizio dell'esecuzione dello script.
Nella parte superiore dello script aggiungere questo per un secondo conteggio:
export PS4='+[${SECONDS}s][${BASH_SOURCE}:${LINENO}]: ${FUNCNAME[0]:+${FUNCNAME[0]}(): }'; set -x;
stesso ma con millisecondi invece:
N=`date +%s%N`; export PS4='+[$(((`date +%s%N`-$N)/1000000))ms][${BASH_SOURCE}:${LINENO}]: ${FUNCNAME[0]:+${FUNCNAME[0]}(): }'; set -x;
L'ultimo esempio può andare alla precisione microsecondo, basta tenere a mente stai usando bash :).
exampe script:
#!/bin/bash
N=`date +%s%N`
export PS4='+[$(((`date +%s%N`-$N)/1000000))ms][${BASH_SOURCE}:${LINENO}]: ${FUNCNAME[0]:+${FUNCNAME[0]}(): }'; set -x;
sleep 1
exit
Esempio output di debug:
+[3ms][/root/db_test.sh:5]: sleep 1
+[1012ms][/usr/local/bin/graphite_as_rand_stat.sh:6]: exit
Tenete a mente che è possibile eseguire il debug in modo selettivo una parte specifica dello script racchiudendolo in 'set -x' alla debug start e 'debug + x' alla fine del debug. I dati di temporizzazione verranno comunque visualizzati correttamente contati dall'inizio dell'esecuzione.
Addendum
Per completezza, se avete bisogno dei dati di temporizzazione differenziale è possibile reindirizzare le informazioni di debug in un file e di processo in seguito.
Dato questo script di esempio:
#!/bin/bash
N=`date +%s%N`
export PS4='+[$(((`date +%s%N`-$N)/1000000))ms][${BASH_SOURCE}:${LINENO}]: ${FUNCNAME[0]:+${FUNCNAME[0]}(): }'; set -x;
sleep 1
for ((i=0;i<2;i++)); do
o=$(($RANDOM*$RANDOM/$RANDOM))
echo $o
sleep 0.$o
done
exit
Run it durante il reindirizzamento di debug in un file:
./example.sh 2>example.dbg
E l'uscita del differenziale di temporizzazione di debug con questo (si estende su più linee):
p=0; cat example.dbg | while read l; do [[ ! ${l%%[*} =~ ^\+ ]] && echo $l && continue; i=`echo $l | sed 's#[^0-9]*\([0-9]\+\).*#\1#'`; echo $l | sed "s#${i}ms#${i}ms+$(($i-$p))ms#"; p=$i; done
Uscita:
+[2ms+2ms][./example.sh:5]: sleep 1
+[1006ms+1004ms][./example.sh:6]: ((i=0))
+[1009ms+3ms][./example.sh:6]: ((i<2))
+[1011ms+2ms][./example.sh:7]: o=19258
+[1014ms+3ms][./example.sh:8]: echo 19258
+[1016ms+2ms][./example.sh:9]: sleep 0.19258
+[1213ms+197ms][./example.sh:6]: ((i++))
+[1217ms+4ms][./example.sh:6]: ((i<2))
+[1220ms+3ms][./example.sh:7]: o=176
+[1226ms+6ms][./example.sh:8]: echo 176
+[1229ms+3ms][./example.sh:9]: sleep 0.176
+[1442ms+213ms][./example.sh:6]: ((i++))
+[1460ms+18ms][./example.sh:6]: ((i<2))
+[1502ms+42ms][./example.sh:11]: exit
Molto ben fatto. La domanda viene taggata 'linux', ma dal momento che le tecniche sono potenzialmente utili su tutte le piattaforme che supportano bash, permettetemi di aggiungere: purtroppo,'% N' non funziona con 'date' su BSD/OSX, quindi la variante dei millisecondi non funziona ci lavoro. – mklement0
Anche la variante dei millisecondi lo fa, ma per ottenere anche la variante '$ SECONDS' per iniziare a misurare dal punto in cui' set -x' viene eseguito, eseguire 'SECONDS = 0' prima. Infine, vale la pena ricordare che l'atto di misurare se stesso aumenterà leggermente il tempo di esecuzione, meno con l'approccio "$ SECONDI". – mklement0
Risposta molto bella. Vedi anche http://stackoverflow.com/questions/5014823/how-to-profile-a-bash-shell-script –
- 1. Come limitare il tempo di esecuzione di uno script BASH
- 2. ottenere lo script bash per echo il comando in esecuzione
- 3. Come posso misurare il tempo di esecuzione di uno script?
- 4. Come posso eseguire il debug di uno script Perl?
- 5. Esecuzione di uno script di shell bash in java
- 6. script bash scrittura esecuzione di tempo in un file
- 7. Come ottenere il nome di uno script Python in esecuzione?
- 8. Come utilizzare il comando 'history-c' in uno script bash?
- 9. ottenere i valori dal comando 'tempo' tramite script bash
- 10. Come eseguire il debug di tempo tra $ ionicView.beforeEnter e $ ionicView.enter
- 11. Comando di tempo per analizzare (bash)
- 12. Come includere il file in uno script di shell bash
- 13. COME USARE Pycharm per eseguire il debug di script Python?
- 14. Come ottimizzare il tempo di avvio di uno script SCons?
- 15. Come ottenere il runtime di uno script R?
- 16. Come utilizzare la correzione rapida in Vim per eseguire il debug di script Bash
- 17. Comando bash di esecuzione Android nell'app
- 18. Come eseguire il debug di script di riscrittura htaccess
- 19. Come eseguire uno script .sql da bash
- 20. Ottenere PHP per eseguire uno script Python
- 21. Come posso eseguire il debug di uno script CLI PHP con xdebug?
- 22. Come utilizzare struct timeval per ottenere il tempo di esecuzione?
- 23. mysql comando riga tempo di esecuzione ritorno?
- 24. Esecuzione di un comando bash tramite CMake
- 25. Script di Bash per eseguire il comando su tutti i file in una directory
- 26. Come eseguire uno script python da un altro script python e ottenere il codice di stato restituito?
- 27. Come eseguire il debug di uno std :: eccezione bad_cast
- 28. Esecuzione di script bash da java
- 29. Come eseguire il debug di uno StackOverflowException in .NET
- 30. Esecuzione di uno script come altro utente e avvio di uno script
Perché sei così impaziente? Passare un'ora per radere il secondo dispari durante l'esecuzione della sceneggiatura? –
Lo script viene eseguito abbastanza spesso, è necessario ottimizzarlo. – Justin
Quanto spesso spesso? La velocità è così importante forse scrivere in C++ (per esempio) è un'opzione migliore. Inoltre perché non pubblicare la sceneggiatura? –