linux刷命令脚本,linux – 如何调试bash脚本并获得每个命令的执行时间

这是尽可能接近内置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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值