一、關於本文
工作要做的監控系統需要監控磁盤空間的使用率並報警。在測試這個功能的時候需要模擬兩個場景:一是磁盤空間不斷增長超過設定的閾值時,需要觸發報警機制;二是磁盤空間降落到低於報警閾值的時候,不再進行報警。為了測試這兩個場景,我寫了下面三個腳本:
1)initializer.sh:創建目錄TestDir,並創建一個大文件template
2)duplicator.sh:不斷復制文件template,直到磁盤空間使用率超過輸入的參數為止
3)cleaner.sh:清除前面兩個腳本留下的痕跡,即刪除目錄TestDir
二、initializer.sh
最開始創建一個大文件的方式是通過Shell向文件中寫入字符並復制的方式,代碼如下(initializer.sh.old):
#!/bin/sh #本腳本用於初始化工作,創建文件夾TestDir並寫入一個大小為100M的目錄 #創建文件TestDir if [ -x "./TestDir" ]; then rm -rf TestDir fi mkdir 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=0 while [ true ]; do if [ "$i" -gt 1020 ]; then break fi cp template.txt $i ((i++)) done echo "文件制造完畢,空間占用信息如下" pwd . du -sh . cd ../.. exit 0
這種方式效率比較低,並且代碼比較長,后來改用dd命令實現功能(initializer.sh):
#!/bin/sh #本腳本用於初始化工作,創建文件夾TestDir並寫入一個大小為100M的目錄 #創建文件TestDir if [ -x "./TestDir" ]; then rm -rf TestDir fi mkdir TestDir cd TestDir dd if=/dev/zero of=template bs=1M count=1024 pwd . du -sh . cd .. exit 0
這個腳本創建了TestDir目錄,並在里面寫入了一個1.1GB的文件template
三、duplicator.sh
腳本duplicator.sh接受一個5-95的數字,作為閾值。這個腳本不斷復制initializer.sh創建的template文件,直到里面指定的磁盤空間使用率超過輸入的閾值時,才停止運行。
#!/bin/sh #運行本腳本前請先運行腳本 initializer.sh #本腳本用於不斷復制文件,直到給出的參數閾值超過當前磁盤空間利用率 #輸入參數:磁盤空間使用率閾值 #函數:打印腳本使用說明 function usage() { echo "Usage: ./duplicator [threshold]" echo "threshold is an integer in the range of [1,99]" echo "*Run initializer.sh before run this script" exit 0 } #腳本有且只有一個輸入 if [ "$#" -ne 1 ]; then echo "腳本應有且只有一個輸入" usage fi #腳本的輸入必須為5-95之間的正整數 threshold=`echo $1 | bc` if [ "$threshold" -lt 5 -o "$threshold" -gt 95 ]; then echo "腳本的輸入必須為5-95之間的正整數" usage fi #目錄TestDir必須存在 if [ ! -d ./TestDir ]; then echo "缺少目錄 TestDir" usage fi #文件TestDir/template必須存在 if [ ! -f ./TestDir/template ]; then echo "缺少文件 TestDir/template" usage fi cd TestDir #復制文件,超過輸入的閾值為止 i=0 while [ true ]; do cur=`df -h | grep /dev/sda3 | awk '{printf substr($5,1,length($5)-1)}'` 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
四、cleaner.sh
這個腳本用於清除前兩個腳本在系統中留下的痕跡
#!/bin/sh #本腳本用於清空腳本initializer.sh和duplicator.sh留下的痕跡 #檢查文件是否存在 if [ ! -x "./TestDir" ]; then echo "文件 ./TestDir 不存在,無需清除" exit 0 fi #用戶確認后清除文件 echo "真的要清除全部數據嗎? (y/n)" read input case "$input" in y* | Y* ) rm -rf ./TestDir echo "數據刪除完畢";; n* | N* ) echo "放棄刪除數據";; * ) echo "輸入未識別";; esac exit 0
五、調用效果截圖