Shell腳本:向磁盤中批量寫入數據


一、關於本文

工作要做的監控系統需要監控磁盤空間的使用率並報警。在測試這個功能的時候需要模擬兩個場景:一是磁盤空間不斷增長超過設定的閾值時,需要觸發報警機制;二是磁盤空間降落到低於報警閾值的時候,不再進行報警。為了測試這兩個場景,我寫了下面三個腳本:

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

五、調用效果截圖


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM