最近在做性能測試,要查看系統執行過程中線程數,很簡單輸入命令: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。執行結果如圖