私はbash
スクリプトを実行するのに約5秒かかる。私はそれをデバッグし、どのコマンドが最長の時間を取っているかを判断したいと思います。これを行う最善の方法は何ですか?私が設定できるフラグはありますか? #!/bin/bash -vx
の設定は本当に役に立ちません。私が欲しいのは、基本的に行番号による実行時間です。bashスクリプトをデバッグしてコマンドごとの実行時間を取得する方法
答えて
set -x
を使用すると、実行前に各コマンドをスクリプトで出力できます。私はコマンドタイミングを自動的に追加する方法を知らない。スクリプト全体にdate
コマンドを振りかけて時間をマークすることができます。
ユーティリティtime
を使用して、個々のコマンド/機能の実行時間を測定できます。例えば
:
次のようなもので、そのスクリプトの結果実行[[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
:
[[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
'test'を関数名として使用しないでください。シェルが内蔵されています。 'test_time'か何かに名前を変更してください... – anishsane
コメントありがとうございます。一定。 – Ben
nitick: 'time'はデフォルトで_shellキーワードです(外部ユーティリティ'/usr/bin/time'としても存在します)。シェルのキーワードだけが任意のシェルコマンドを測定することができます_全体として( 'time ls | sleep 1'から'/usr/bin/time ls | sleep 1'への出力を比較してください)。 – mklement0
これは、スクリプトの実行開始時刻から総合的なタイミング情報を提供するため、組み込みのbashデバッグ機能を使用して可能な限り近づいています。スクリプトの先頭に
秒のカウントのためにこれを追加します。同じ
export PS4='+[${SECONDS}s][${BASH_SOURCE}:${LINENO}]: ${FUNCNAME[0]:+${FUNCNAME[0]}(): }'; set -x;
ではなく、ミリ秒単位で:
N=`date +%s%N`; export PS4='+[$(((`date +%s%N`-$N)/1000000))ms][${BASH_SOURCE}:${LINENO}]: ${FUNCNAME[0]:+${FUNCNAME[0]}(): }'; set -x;
最後の例は、ちょうど心に留めておく、マイクロ秒の精度に行くことができますあなたはbash :)を使っています。
Exampeスクリプト:
#!/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
例のデバッグ出力:
+[3ms][/root/db_test.sh:5]: sleep 1
+[1012ms][/usr/local/bin/graphite_as_rand_stat.sh:6]: exit
あなたが選択的に「-x設定」で囲むことで、スクリプトの特定の部分をデバッグすることができますに注意してくださいにデバッグの開始時に 'debug + x'を指定します。タイミングデータは実行開始から正しくカウントされます。
補遺
完全を期すためにあなたは、差動タイミングデータが必要な場合は、ファイルにデバッグ情報をリダイレクトし、後でそれを処理することができます。
を考えると、このスクリプトの例:
#!/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
を実行してファイルへのデバッグをリダイレクトながら:
:./example.sh 2>example.dbg
と出力これで差動デバッグタイミングは、(複数行をカバー)
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
出力:
+[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
非常にうまくやった。 BSD/OSXの 'date'では'%N'は動作しませんので、ミリ秒の変種はありません。この問題は、 'linux'とタグ付けされていますが、このテクニックはbashをサポートするすべてのプラットフォームで役に立つ可能性があるので、そこで働きません。 – mklement0
ミリ秒の変形もこれを行いますが、 'set -x'が実行された時点から測定を開始する' $ SECONDS'変種を取得するには、まずSECONDS = 0を実行してください。最後に、 '$ SECONDS'アプローチでは、測定時間がわずかに増えることになります。 – mklement0
非常に良い答え。 http://stackoverflow.com/questions/5014823/how-to-profile-a-bash-shell-scriptも参照してください。 –
- 1. bashスクリプトとコンソール間のコマンド実行時間の差 - スクリプトのエラー?
- 2. Pythonスクリプトの実行時間を取得
- 3. sshを実行してコマンドを実行するbashスクリプト
- 4. Cでbashコマンドを実行して出力を取得する方法は?
- 5. PHPスクリプトの実行時間の取得方法
- 6. bashスクリプトを定期的にコマンドを実行する方法
- 7. 他のスクリプトの実行時間を見るためのBashスクリプト
- 8. Laravel 5 - Artisanコマンドを作成してbashスクリプトを実行する方法
- 9. 変数としてbashコマンドを指定して実行時に実行する
- 10. PS0とPS1を使って各bashコマンドの実行時間を表示する
- 11. SQl Server 2008 R2でスクリプトを実行する時間を取得
- 12. コマンドを実行して出力を取得する方法
- 13. bashスクリプトを使ってmenuselect/menuselectコマンドを実行する方法は?
- 14. 次の実行時間を取得する方法Spring Scheduling?
- 15. ノードjsセイルアプリケーションの実行時間プロファイルを取得する方法
- 16. シェルスクリプト実行の残り時間を取得する方法は?
- 17. bashスクリプトでgcloudコマンドを実行
- 18. Pythonスクリプトにbashコマンドを実行
- 19. 1時間ごとに1時間ごとにアドレス数を取得する方法
- 20. suコマンドを実行しているBashスクリプト
- 21. シェルx秒間に5秒ごとにコマンドを実行するスクリプト
- 22. sidekiqからジョブ実行時間を取得する方法は?
- 23. テキストファイルからbashスクリプトを使ってコマンドを実行する
- 24. bashを使用してコミットごとにgitログ出力でコマンドを実行する方法
- 25. は、私はbashスクリプトから次のコマンドを実行するbashスクリプト
- 26. シェルスクリプト内で実行されるPythonスクリプトの実行時間を取得
- 27. firebase-databaseから時間を取得した後にタイマーを実行したい、ReactJSのsetInterval()を使って1秒ごとに時間を減らす方法
- 28. oracle sqlplusでsqlスクリプトの実行時間を取得
- 29. PHPスクリプトを使用してwineコマンドを実行する方法
- 30. スクリプトを使用してdjangoコマンドを実行する方法
どうしてそんなに気楽ですか?スクリプトを実行するときに奇妙な秒を切るために1時間を費やすつもりですか? –
スクリプトは非常に頻繁に実行され、最適化する必要があります。 – Justin
頻繁にどのくらいの頻度ですか?それは、おそらくC++で書くことが重要なこと(例えば)がより良い選択肢であるということです。スクリプトを投稿しない理由は何ですか? –