Linux腳本學習筆記,log函數使用技巧
本文主要講述的是一個關于記錄shell腳本執(zhí)行日志的日志腳本函數,在做shell腳本開發(fā)的過程中,常常要運行腳本來監(jiān)測一些系統(tǒng)數據,但是我們又沒有很多時間來一直盯著命令控制臺看,所以看能不能把這些腳本運行的情況記錄成一個日志并保存下來,方便我們有時間的時候查看。
需求:
1、可以記錄腳本的運行情況
2、可以記錄時間
3、可以在輸入log達到一定的行數后對以前的log進行刪減,防止log文件無限累積
需求分析
需求很簡單,想想看好像有很多方式可以實現,最終結合個人喜好和技術能力,選擇編寫一個運行在shell腳本里面的函數;這個函數的作用是將shell腳本中需要輸出的日志信息,輸出成與腳本同名的log文本,記錄在系統(tǒng)中,方便開發(fā)人員在空閑時間進行查閱,分析腳本的運行情況。
需求實現:
經過三天三夜的奮戰(zhàn),寫出了以下腳本函數:
#!/bin/bash
log(){
#log文件名
local fileName="./$(basename $0 .sh).log"
#log文件最大存儲log行數(此處設置最大存儲log行數是100行)
local fileMaxLen=100
#超過log最大存儲行數后需要從頂部開始刪除的行數(此處設置的是刪除第1到第10行的數據)
local fileDeleteLen=10
if test $fileName
then
#記錄log
echo "[`date +%y/%m/%d-%H:%M:%S`]:$*" >> $fileName
#獲取log文件實際行數
loglen=`grep -c "" $fileName`
if [ $loglen -gt $fileMaxLen ]
then
#從頂部開始刪除對應行數的log
sed -i '1,'$fileDeleteLen'd' $fileName
fi
else
echo "[`date +%y/%m/%d-%H:%M:%S`]:$*" > $fileName
fi
}
#test
testdate=100
#記錄輸出的字符串
log "test string"
#記錄輸出的數據
log "testdate=$testdate"
#記錄輸出的運算
log $[1+2]
#記錄命令輸出的信息
log $(printf "this is cmd test %s\n" "this is cmd output string")
其中主要的就是log()這個腳本函數,'#test’之后的都是對這個函數的測試。
實現功能:
1、可以快速的加入到當前的腳本中,加入方法:將log()函數復制到在當前的腳本的最前面,然后后面對需要記錄的日志直接調用log就可以;
2、加入需要記錄日志的腳本后,執(zhí)行腳本時,會在執(zhí)行腳本同目錄下生成一個同名的.log文件,里面就是執(zhí)行腳本的日志輸出;
3、可以記錄腳本運行時間及可對字符串、數據變量、及命令輸出的信息進行記錄;
4、可以對log文件的行數進行判斷,當行數超過最大限制行數后,會從log文件頂部開始刪除以前的log記錄。
使用示例:
比如要實時查看CPU的溫度,就有如下腳本(cputemp.sh):
#!/bin/bash
echo CPU temperature is $[`cat /sys/class/thermal/thermal_zone0/temp`/1000]
在命令控制臺使用watch命令可以做到實時監(jiān)控:
watch -n 1 ./cputemp.sh
執(zhí)行結果如下:
這樣是可以實現實時查看,可是為了數據的延續(xù)性,所以我加上了log腳本函數,修改了cputemp.sh腳本,如下:
#!/bin/bash
log(){
#log文件名
local fileName="./$(basename $0 .sh).log"
#log文件最大存儲log行數(此處設置最大存儲log行數是100行)
local fileMaxLen=100
#超過log最大存儲行數后需要從頂部開始刪除的行數(此處設置的是刪除第1到第10行的數據)
local fileDeleteLen=10
if test $fileName
then
#記錄log
echo "[`date +%y/%m/%d-%H:%M:%S`]:$*" >> $fileName
#獲取log文件實際行數
loglen=`grep -c "" $fileName`
if [ $loglen -gt $fileMaxLen ]
then
#從頂部開始刪除對應行數的log
sed -i '1,'$fileDeleteLen'd' $fileName
fi
else
echo "[`date +%y/%m/%d-%H:%M:%S`]:$*" > $fileName
fi
}
echo CPU temperature is $[`cat /sys/class/thermal/thermal_zone0/temp`/1000]
log $(echo CPU temperature is $[`cat /sys/class/thermal/thermal_zone0/temp`/1000])
使用watch命令循環(huán)執(zhí)行:
watch -n 1 ./cputemp.sh
執(zhí)行在命令控制臺的結果和之前是一樣的,但是現在在同一個文件目錄下會生成一個cputemp.log的文件,查看該文件可以發(fā)現CPU的溫度信息已記錄。
使用cat命令查看cputemp.log:
cat ./cputemp.log
得到文件內容,如下:
從圖中可以看出CPU溫度在40-41之間波動。
注意事項
1、不能把watch命令寫到cputemp.sh腳本里面
這中間還是有一點不完善的地方是,不能把watch命令寫到cputemp.sh腳本里面是比較麻煩的,如果把watch命令寫到cputemp.sh腳本里面,就會出現執(zhí)行的溫度信息被固定成一個固定值,不能做到實時查看。
如下:
修改的腳本:
#!/bin/bash
watch -n 1 echo CPU temperature is $[`cat /sys/class/thermal/thermal_zone0/temp`/1000]
執(zhí)行:
./cputemp.sh
執(zhí)行結果:
從執(zhí)行結果中可以看到:
$[`cat /sys/class/thermal/thermal_zone0/temp`/1000]
被固定成了40,導致每秒循環(huán)只是打?。?/p>
CPU temperature is 40
而不能達到效果,所以目前只能用命令調用腳本的方式了。
2、單引號內引用變量需要嵌套單引號
在使用 sed 命令時用到了單引號(‘’),單引號內需要引用變量時,需要對引用變量嵌套單引號,不然會報錯。
sed -i '1,'$fileDeleteLen'd' $fileName
總結:
目前這種實現方式也滿足了基本需求。