最近在做性能测试,要查看系统执行过程中线程数,很简单输入命令:netstat -anp |grep java |wc -l,可以查询。但是如何在执行过程定时打印系统线程数且将结果输出到指定文件呢?也很简单我们直接写一个shell脚本执行下就可以了。以下是思路
1:创建目录,且创建个脚本:mkdir epayshell; touch output-thread.sh,编辑脚本 vi output-thread.sh
2:编写脚本:设置变量step=5,该参数控制每5秒执行一次命令;outFile变量指定输出文件路径为当前路径;for循环判断小于60,则每5s执行date、netstat -anp |grep java |wc -l命令且将结果输出到outFile当前路径下。
step=10
outFile=out.log
for (( i = 0; i < 20; i=(i+step) )); do
date >> $outFile
netstat -anp |grep java |wc -l >> $outFile
sleep $step
done
exit 0
3:保存脚本,执行结果。
执行脚本命令:sh ./output-thread.sh。在当前路径下生成文件out.log。打开可看见结果
4:优化该脚本,可以参数化执行该脚本。
从步骤2可以看出脚本只能执行2次,且脚本每10s执行命令date、netstat -anp |grep java |wc -l,没有实现参数化。可以优化。
采用$0,$1,$2..等方式获取脚本命令行传入的参数。$1第一个参数为:执行时间;$2第一个参数为:多少秒执行一次;$3第一个参数为:执行结果文件名,如果第三个参数为空则默认输出的文件名为out.log
execTime=$1
step=$2
outFile=out.log
if [ -n "$3" ] ;then
outFile=$3
fi
rm -rf $outFile
for (( i = 0; i < execTime; i=(i+step) )); do
date >> $outFile
netstat -anp |grep java |wc -l >> $outFile
sleep $step
done
exit 0
例如执行:sh ./output-thread.sh 20 10 out1.log;表明脚本执行次数为2(20/10=2);每10秒执行一次;输出文件名为out1.log。执行结果如图