Shell指令碼:向磁碟中批量寫入資料

來源:互聯網
上載者:User

標籤: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指令碼:向磁碟中批量寫入資料

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.