一、关于本文

工作要做的监控系统需要监控磁盘空间的使用率并报警。在测试这个功能的时候需要模拟两个场景:一是磁盘空间不断增长超过设定的阈值时,需要触发报警机制;二是磁盘空间降落到低于报警阈值的时候,不再进行报警。为了测试这两个场景,我写了下面三个脚本:

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

五、调用效果截图

Shell脚本:向磁盘中批量写入数据的更多相关文章

  1. HBase BulkLoad批量写入数据实战

    1.概述 在进行数据传输中,批量加载数据到HBase集群有多种方式,比如通过HBase API进行批量写入数据.使用Sqoop工具批量导数到HBase集群.使用MapReduce批量导入等.这些方式, ...

  2. 使用XML向SQL Server 2005批量写入数据——一次有关XML时间格式的折腾经历

    原文:使用XML向SQL Server 2005批量写入数据——一次有关XML时间格式的折腾经历 常常遇到需要向SQL Server插入批量数据,然后在存储过程中对这些数据进行进一步处理的情况.存储过 ...

  3. MSSQL批量写入数据方案

    近来有一个项目Feature需要有批量写入数据的场景,正巧整理资料发现自己以前也类似实现的项目,在重构的同时把相关资料做了一个简单的梳理,方便大家参考. 循环写入(简单粗暴,毕业设计就这样干的)(不推 ...

  4. 使用XML向SQL Server 2005批量写入数据——一次有关XML时间格式的折腾经历

    使用XML向SQL Server 2005批量写入数据——一次有关XML时间格式的折腾经历   原文:使用XML向SQL Server 2005批量写入数据——一次有关XML时间格式的折腾经历 常常遇 ...

  5. shell脚本(多线程批量创建用户)

    shell脚本中的多线程 很多场景中会用到多线程,例如备份数据库,有100个库,正常备份效率极其低下.有了多线程原本可能需要10个小时备份,现在分10个线程同时去干,只要一个小时就解决了.今天就介绍下 ...

  6. 如何使用shell脚本快速排序和去重文件数据

    前面写过一篇通过shell脚本去重10G数据的文章,见<用几条shell命令快速去重10G数据>.然而今天又碰到另外一个业务,业务复杂度比上次的单纯去重要复杂很多.找了很久没有找到相应的办 ...

  7. Saiku数据库迁移后的刷新脚本-Shell脚本读取数据库中的数据(二十三)

    Saiku数据库迁移后的刷新脚本 之前有谈过对saiku中的数据进行刷新,因为saiku默认会从缓存中查询数据,但是配置不使用缓存又会效率低下... 所以这里就需要做一个数据刷新,每次ETL之后都需要 ...

  8. shell脚本之分析oracle数据库数据泵日志中表的大小

    1.分析日志格式如下 . . imported "xxx_330508"."xxx_T_DATA" 46.17 MB 268 rows . . imported ...

  9. 通过Shell脚本来创建批量服务器上的MySQL数据库账号

    1.项目背景 因监控需要,我们需要在既有的每个MySQL实例上创建一个账号.公司有数百台 MySQL 实例,如果手动登入来创建账号很麻烦,也不现实.所以,我们写了一个简单的shell脚本,用来创建批量 ...

随机推荐

  1. android sdk更新代理设置

    mirrors.neusoft.edu.cn 80

  2. TQ2440与西门子S7-200 PLC自由口通信实现过程中问题总结

    1.在win7上安装好PLC编程软件 STEP 7 MicroWIN 之后,无法实现编程软件与PLC的通信连接? 原因:STEP 7 MicroWIN 对win7支持不是很好 解决办法:在win7中安 ...

  3. Codeforces Round #234 (Div. 2) :A. Inna and Choose Options

    A. Inna and Choose Options time limit per test 1 second memory limit per test 256 megabytes input st ...

  4. python转换html到pdf文件

    1.安装wkhtmltopdf Windows平台直接在 http://wkhtmltopdf.org/downloads.html 下载稳定版的 wkhtmltopdf 进行安装,安装完成之后把该程 ...

  5. MongoDB副本集配置系列四:节点的关闭顺序

    接上一篇博客:http://www.cnblogs.com/xiaoit/p/4522218.html Primary Secondary Arbiter 1:关闭顺序PSA :会报错 2:关闭顺序P ...

  6. cocos2d-js 3.0 rc2 自定义UI控件组件 例子:能播放动画的MenuItem。MenuItemSprite的bug

    其实总体自定义UI组件都比较简单,尤其是cocos2d-js是开源的,如果有什么不明白的直接看js代码或者C++代码即可.当然js代码基本就够了. 另外,js的ctor函数虽然说是构造函数,但毕竟不是 ...

  7. Axure 图片轮播(广告通栏图片自动播放效果)

    baiduYunpan:http://pan.baidu.com/s/1eRPCy90 里面的“图片轮播”部件即可实现这个功能

  8. 【Dubbo实战】 Dubbo+Zookeeper+Spring整合应用篇-Dubbo基于Zookeeper实现分布式服务(转)

    Dubbo与Zookeeper.Spring整合使用 Dubbo采用全Spring配置方式,透明化接入应用,对应用没有任何API侵入,只需用Spring加载Dubbo的配置即可,Dubbo基于Spri ...

  9. Ubuntu x86-64汇编(3) 数值操作指令

    指令标注 Operand Notation 指令instruction即运算operation, 操作的对象为一个或多个运算数operand, 使用不同的标记表示不同的约束 <reg>  ...

  10. Android的Button按钮,ACTION_UP事件不触发解决方案

           在android 编程时,有时候要实现当Button一直按下的时候,执行一些逻辑代码,当按钮弹起的时候,终止这些逻辑代码的执行.      比如在 设置页面的滑动开关时,如果不监听ACT ...