標籤:style http io ar os 使用 sp for strong
一、關於本文
工作要做的監控系統需要監控磁碟空間的使用率並警示。在測試這個功能的時候需要類比兩個情境:一是磁碟空間不斷增長超過設定的閾值時,需要觸發警示機制;二是磁碟空間降落到低於警示閾值的時候,不再進行警示。為了測試這兩個情境,我寫了下面三個指令碼:
1)initializer.sh:建立目錄TestDir,並建立一個大檔案template
2)duplicator.sh:不斷複製檔案template,直到磁碟空間使用率超過輸入的參數為止
3)cleaner.sh:清除前面兩個指令碼留下的痕迹,即刪除目錄TestDir
二、initializer.sh
最開始建立一個大檔案的方式是通過Shell向檔案中寫入字元並複製的方式,代碼如下(initializer.sh.old):
#!/bin/sh#本指令碼用於初始化工作,建立檔案夾TestDir並寫入一個大小為100M的目錄#建立檔案TestDirif [ -x "./TestDir" ]; then rm -rf TestDirfimkdir TestDircd TestDirmkdir Templatecd Templatetouch template.txt#製作大小為100K的檔案template.txtstring=""repetend="012345678901234|"for((i=1;i<6400;i++))do string=$string$repetenddoneecho $string >> template.txt#複製1000個該檔案i=0while [ true ]; do if [ "$i" -gt 1020 ]; then break fi cp template.txt $i ((i++))doneecho "檔案製造完畢,空間佔用資訊如下"pwd .du -sh .cd ../..exit 0
這種方式效率比較低,並且代碼比較長,後來改用dd命令實現功能(initializer.sh):
#!/bin/sh#本指令碼用於初始化工作,建立檔案夾TestDir並寫入一個大小為100M的目錄#建立檔案TestDirif [ -x "./TestDir" ]; then rm -rf TestDirfimkdir TestDircd TestDirdd if=/dev/zero of=template bs=1M count=1024pwd .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 "指令碼應有且只有一個輸入" 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" usageficd TestDir#複製檔案,超過輸入的閾值為止i=0while [ 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++))donecd .. #TestDirecho "Script finished!"exit 0
四、cleaner.sh
這個指令碼用於清除前兩個指令碼在系統中留下的痕迹
#!/bin/sh#本指令碼用於清空指令碼initializer.sh和duplicator.sh留下的痕迹#檢查檔案是否存在if [ ! -x "./TestDir" ]; then echo "檔案 ./TestDir 不存在,無需清除" exit 0fi#使用者確認後清除檔案echo "真的要清除全部資料嗎? (y/n)"read inputcase "$input" in y* | Y* ) rm -rf ./TestDir echo "資料刪除完畢";; n* | N* ) echo "放棄刪除資料";; * ) echo "輸入未識別";;esacexit 0
五、調用效果
END
Shell指令碼:向磁碟中批量寫入資料