linux – 如何调试bash脚本并获得每个命令的执行时间
发布时间:2020-12-14 02:38:29 所属栏目:Linux 来源:网络整理
导读:我有一个bash脚本,需要将近5秒钟才能运行.我想调试它,并确定哪些命令花费的时间最长.这样做的最佳方式是什么?我可以设置一个标志吗?设置#!/ bin / bash -vx并没有什么帮助.我想要的基本上是按行号执行时间. 解决方法 这是尽可能接近内置bash调试工具的答
我有一个bash脚本,需要将近5秒钟才能运行.我想调试它,并确定哪些命令花费的时间最长.这样做的最佳方式是什么?我可以设置一个标志吗?设置#!/ bin / bash -vx并没有什么帮助.我想要的基本上是按行号执行时间.
解决方法
这是尽可能接近内置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 :). 示例脚本: #!/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 请记住,您可以选择性地调试脚本的特定部分,方法是将其封装在调试启动时的“set -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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |