一、關於本文
工作要做的監控系統需要監控磁碟空間的使用率並報警。在測試這個功能的時候需要模擬兩個場景:一是磁碟空間不斷增長超過設定的閾值時,需要觸發報警機制;二是磁碟空間降落到低於報警閾值的時候,不再進行報警。為了測試這兩個場景,我寫了下面三個指令碼:
1)initializer.sh:建立目錄testdir,並建立乙個大檔案template
2)duplicator.sh:不斷複製檔案template,直到磁碟空間使用率超過輸入的引數為止
3)cleaner.sh:清除前面兩個指令碼留下的痕跡,即刪除目錄testdir
二、initializer.sh
最開始建立乙個大檔案的方式是通過shell向檔案中寫入字元並複製的方式,**如下(initializer.sh.old):
#這種方式效率比較低,並且**比較長,後來改用dd命令實現功能(initializer.sh):!/bin/sh
#本指令碼用於初始化工作,建立資料夾testdir並寫入乙個大小為100m的目錄
#建立檔案testdir
if [ -x "
./testdir
"]; then
rm -rf testdir
fimkdir testdir
cd testdir
mkdir template
cd template
touch template.txt
#製作大小為100k的檔案template.txt
string=""
repetend="
012345678901234|
"for((i=1;i<6400;i++))
do string=$string$repetend
done
echo $string >>template.txt
#複製1000個該檔案
i=0while
[ true ]; do
if [ "
$i" -gt 1020]; then
break
fi cp template.txt $i
((i++))
done
echo
"檔案製造完畢,空間占用資訊如下
"pwd .
du -sh .
cd ../..
exit 0
#這個指令碼建立了testdir目錄,並在裡面寫入了乙個1.1gb的檔案template!/bin/sh
#本指令碼用於初始化工作,建立資料夾testdir並寫入乙個大小為100m的目錄
#建立檔案testdir
if [ -x "
./testdir
"]; then
rm -rf testdir
fimkdir testdir
cd testdir
dd if=/dev/zero of=template bs=1m count=1024pwd .
du -sh .
cd ..
exit 0
三、duplicator.sh
指令碼duplicator.sh接受乙個5-95的數字,作為閾值。這個指令碼不斷複製initializer.sh建立的template檔案,直到裡面指定的磁碟空間使用率超過輸入的閾值時,才停止執行。
#四、cleaner.sh這個指令碼用於清除前兩個指令碼在系統中留下的痕跡!/bin/sh
#執行本指令碼前請先執行指令碼 initializer.sh
#本指令碼用於不斷複製檔案,直到給出的引數閾值超過當前磁碟空間利用率
#輸入引數:磁碟空間使用率閾值
#函式:列印指令碼使用說明
function usage()
#指令碼有且只有乙個輸入
if [ "
$#" -ne 1]; then
echo
"指令碼應有且只有乙個輸入
"usagefi#
指令碼的輸入必須為5-95之間的正整數
threshold=`echo $1 |bc`
if [ "
$threshold
" -lt 5 -o "
$threshold
" -gt 95]; then
echo
"指令碼的輸入必須為5-95之間的正整數
"usagefi#
目錄testdir必須存在
if [ ! -d ./testdir ]; then
echo
"缺少目錄 testdir
"usagefi#
檔案testdir/template必須存在
if [ ! -f ./testdir/template ]; then
echo
"缺少檔案 testdir/template
"usage
ficd testdir
#複製檔案,超過輸入的閾值為止
i=0while
[ true ]; do
cur=`df -h | grep /dev/sda3 | awk ''`
echo
"current usage: $cur | object usage: $threshold
"if [ "
$cur
" -gt "
$threshold
"]; then
break
; fi
cp template $i
echo
"$i duplication complete!
"((i++))
done
cd ..
#testdir
echo
"script finished!
"exit 0
#五、呼叫效果截圖!/bin/sh
#本指令碼用於清空指令碼initializer.sh和duplicator.sh留下的痕跡
#檢查檔案是否存在
if [ ! -x "
./testdir
"]; then
echo
"檔案 ./testdir 不存在,無需清除
"exit 0fi#
使用者確認後清除檔案
echo "
真的要清除全部資料嗎? (y/n)
"read input
case
"$input"in
y* | y*)
rm -rf ./testdir
echo
"資料刪除完畢";;
n* | n*)
echo
"放棄刪除資料";;
*)echo
"輸入未識別";;
esac
exit 0
Shell 向shell指令碼傳參
我們可以在執行 shell 指令碼時,向指令碼傳遞引數,指令碼內獲取引數的格式為 n。n 代表乙個數字,1 為執行指令碼的第乙個引數,2 為執行指令碼的第二個引數,以此類推 傳遞到指令碼的引數個數 以下例項我們向指令碼傳遞三個引數,並分別輸出,其中 0 為執行的檔名 test.sh echo she...
向shell指令碼傳引數
執行 nano test.sh 建立乙個新的shell指令碼。指令碼test.sh的內容如下 bin sh name 1 echo the are great man 給新建立的test.sh的指令碼賦可執行許可權,命令為 chmod 755 test.sh 執行 test.sh xiao wang...
shell 編寫指令碼批量ping ip
伺服器總是一下子買了很多的段的ip。通過繫結後,也不知道這些ip是否繫結成功,所以就寫了乙個shell指令碼,把ip輸好,批量ping一下,看是不是都能ping通。指令碼如下 此外。還有乙個ip檔案,裡面放的都是ip 名為allip 我們來執行一下,看一下結果 除了8.8.他顯示 ping 其他 失...