作为调试过程中的一个重要步骤,查找时间和级数是必不可少的。
经常使用script
和scriptreplay
,我想知道是否存在用于操作结果文件的工具。
示例(来自How to profile a bash shell script slow startup?):
script -t script.log 2>script.tim -c 'bash -x -c "
for ((i=3;i--;));do sleep .1;done
for ((i=2;i--;)) ;do
tar -cf /tmp/test.tar -C / bin
gzip /tmp/test.tar
rm /tmp/test.tar.gz
done
"'
然后有两个文件:
-rw-r--r-- 1 user user 472 Sep 25 10:44 script.log
-rw-r--r-- 1 user user 213 Sep 25 10:44 script.tim
我可以通过以下方式 * 重播 * 脚本:
scriptreplay --timing script.tim --typescript script.log 10
使用10
作为 * 执行时间除数 *,使重放速度加快10倍,或者
scriptreplay --timing script.tim --typescript script.log .1
使重放速度慢10倍。
我想知道是否存在以下工具:
好吧,从那里:
cut -d \ -f1 <script.tim | xargs | tr \ + | bc
3.616809
将输出总执行时间或如果有太多行:
cut -d \ -f1 <script.tim | xargs | tr \ + | bc | xargs | tr \ + | bc
3.616809
和
cut -d \ -f2 <script.tim | xargs | tr \ + | bc
366
sed '1d;$d' script.log |wc -c
367
检查脚本输出大小**。(sed
删除日志的第一行和最后一行,其中包含:Script started on Wed Sep 25 14:40:20 2019
和Script done on Wed Sep 25 14:40:23 2019
。)
然后,计算某个时间的日志大小(指针):
perl -e 'my ($l,$t,$p)=(0,0,0); # line totTime pos
open FH,"<".$ARGV[0] || die;
while (<FH>) {
my ($d,$n)=split" "; # duration numBytes
$l++;
$t+=$d;
$p+=$n;
$t>=${ARGV[1]} && do {
print $l." ".$p."\n";
exit 0;
};
};' script.tim 1.2
12 216
timingfile(head -n 12
)中的第12行和typescript文件(head -c 216
)中的字节位置216。
或者,如果我正在**搜索经过的时间 *,直到某个字符串 *:
grep -ob 'tar.*test' script.log
217:tar -cf /tmp/test
320:tar -cf /tmp/test
perl -e 'my ($l,$t,$p)=(0,0,0);open FH,"<".$ARGV[0] || die;while (<FH>) {
my ($d,$n)=split" ";$l++;$t+=$d;$p+=$n;$p>=${ARGV[1]} && do {
print $l." ".$p."\n";exit 0;};};' script.tim 217
17 228
head -n 17 script.tim | cut -d \ -f1 | xargs | tr \ + | bc
1.091276
我的请求:
寻找更轻的...
1条答案
按热度按时间zd287kbt1#
Preamble:一些小技巧
用于调试目的
script
是非常有用的!在bash下,您可以使用一些技巧。我这里的示例是基于这篇文章中第一个脚本创建的两个文件
script.log
和script.log
(示例来自 * 如何分析bash shell脚本启动缓慢?* ),在 raspberry pi 上运行:xargs | tr \ + | bc |
,您可以确信bash能够管理非常长的算术行:或者,如果您预计执行时间很长,只需添加天数:
script
将创建一个专用的 * 终端 *,所有默认情况下(当未管道化时)对输出进行着色的命令都将以 * 红色 * 打印错误,方法是在输出前添加\E[31m
、\E[31;1m
、\E[1;31m
或类似的前缀。不幸的是,示例文件中没有彩色错误...我在很长的
live-build
进程中使用这个。我运行我的脚本:然后,浏览日志文件中 * 红色 * 突出显示的行可以通过以下方式完成:
这个技巧可以用在下面的两个脚本中。
这是第一次尝试,基于bash
这使用(需要)
xterm
和运行重播脚本输出在一个新的终端具有相同的大小比脚本运行。互动真的是极简主义。这里有两个选项:
-t
通过使用 * 内置 *read
来执行时间间隔,因此可以通过单击Return来加速。-w
提交要搜索的单词或字符串。进度将停止,直到您按下返回。python也很受欢迎!
我的网站上有更多特色版本:
这里:scriptReplay.sh.txt,scriptReplay.sh。
又一个bash脚本
下面是一个小而快速的解决方案(使用
bc
):在
script.log
和script.tim
上运行,这篇文章中的第一个命令将在我的raspberry-pi上渲染: