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

2022-07-05 00:18:11 字數 3646 閱讀 2347

一、關於本文

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

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

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

這種方式效率比較低,並且**比較長,後來改用dd命令實現功能(initializer.sh):

#

!/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

這個指令碼建立了testdir目錄,並在裡面寫入了乙個1.1gb的檔案template

三、duplicator.sh

指令碼duplicator.sh接受乙個5-95的數字,作為閾值。這個指令碼不斷複製initializer.sh建立的template檔案,直到裡面指定的磁碟空間使用率超過輸入的閾值時,才停止執行。

#

!/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

四、cleaner.sh這個指令碼用於清除前兩個指令碼在系統中留下的痕跡

#

!/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 其他 失...