Linux系統下編寫shell指令碼傳入引數列印系統當前執行緒數到指定檔案
最近在做效能測試,要檢視系統執行過程中執行緒數,很簡單輸入命令: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。執行結果如圖