Shell测试运算和流程控制语句 监控disk、cpu和处理qmail邮件队列
2010-01-05 13:04
706 查看
Shell测试运算和流程控制语句 监控disk、cpu和处理qmail邮件队列
2009-08-31 09:30
2009-08-31 09:30
测试运算 数值测试运算 -eq 判断两个数字是否相等,相等返回“0”,不相等返回“1” -ge 判断第一个数字是否大于等于第二个数字,大于等于返回0,小于返回“1” -gt 判断第一个数字是否大于第二个数字,大于返回“0”,不大于返回“1” -le 判断第一个数字是否小于等于第二个数字,小于等于返回“0”,大于返回“1” -lt 判断第一个数字是否小于第二个数字,小于返回“0”,不小于返回“1” -ne 判断两个数不相等,不相等返回“0” ,相等返回“1” 字符串运算测试 string1 = string2 如果两个字符串相等则返回true, 否则返回false。 string1 != string2 如果两个字符串不相等则返回true, 否则返回false。 string1 > string2 如果string 1 大于 string2, 则返回true ,否则返回false。 string1 < string2 如果string 1小于string 2 , 则返回true,否则返回false。 -n string: 如果字符中长度大于0,则返回true , 否则返回false; 通常可以省略-n -z string: 如果字符串的长度等于0,则返回true, 否则返回false。 文件测试运算 -d filename 判断filename 是否为目录,是则返回0,否则返回1 -f filename 判断filename 是否为文件,是则返回0,否则返回1 -r filename 判断filename 是否可读, 是则返回0,否则返回1 -w filename 判断filename 是否可写, 是则返回0,否则返回1 -x filename 判断filename 是否可执行, 是则返回0,否则返回1 -L filename 判断filename 是否是一个符号链接文件, 是则返回0,否则返回1 -s filename 判断filename 的长度是否大于0, 是则返回0,否则返回1 -u filename 判断filename 是否有suid位设置, 是则返回0,否则返回1 复合测试运算 逻辑操作包括与、或,分别用“-a” 和 “-o”来表示。 流程控制语句 1、顺序执行语句:只要把语句按照逻辑顺序写好,Shell脚本解释器就会顺序地执行这些语句。 2、条件选择语句 if then 语句 if 条件表达式 then 语句1 fi if 条件表达式; then 语句1 fi if then else 语句 if 条件表达式; then 语句1 else 语句2 fi if 语句的嵌套语法是: if 条件表达式1; then 语句1 else if 条件表达式2; then 语句2 else 语句3 fi fi if elif 语句 if [ $SYSTEM = "Linux" ] ; then echo "Linux" elif [ $SYSTEM = "FreeBSD" ] ; then echo "FreeBSD" elif [ $SYSTEM = "Solaris" ] ; then echo "Solaris" else echo "What?" fi 或 USER=`who |awk '{ print $1 }'` if [ $USER = "root" ] ; then echo "root" elif [ $USER = "cacti" ] ; then echo "cacti" elif [ $USER = "nagios" ] ; then echo "nagios" elif [ $USER = "mysql" ] ; then fi case 语句 就是一个变量的值与期望的值进行匹配 case $1 in 匹配值1) 语句1 语句2 ………… ………… ;; 匹配值2) 语句3 语句 ………… ………… ;; 匹配值3) 语句5 语句6 ………… ………… ;; esac Shell 脚本中的循环语句包括:for 循环、while循环、until循环 for i in k g h do echo ok done while ls > /dev/null do echo ok done until aa > /dev/null do echo ok done 函数 hello () { echo ok } function hello () { echo hello } 刚刚开始写一些简单脚本,还是觉得不能得心应手,不过总算写完成了。 面试的时候让写监控disk、cpu使用情况超过90% 后,报警给管理员,当时没有写的很准确,回来了就写了一下。如下:有问题请各位网友指出 一、实现硬盘监控。 root@watchout2 ~]# vi watch.sh #!/bin/bash for i in `df -k |awk '{print $5}' |grep -v ^[a-z] |awk -F"%" '{print $1}'` do if [ $i -ge 90 ]; then /bin/mail -s "$HOSTNAME `date +%Y-%m-%d-%H-%M----%w`Filesystem over" bo@future.com < /fileawk -- -f source@watchout.com #/bin/mail -s "fileawk over" bo@future.com < /fileawk -- -f source@watchout.com #cat /fileawk | /bin/mail -s "$HOSTNAME$ Filesystem over" bo@future.com -- -f source@watchout.com else echo `date` Filesystem up to snuff >> /var/log/filesystem.log fi done root@watchout2 ~]# cat /fileawk 192.168.1.238 文件系统使用超过了90% 。 注: 1、这个for的赋值采用的方法有所不同,但效果一样。 for disk in `df -h|awk '{print $5}'|sed 's/%//g'|grep -v "U"` 2、date +%Y-%m-%d-%H-%M----%w可阅读性不强,可换成 date +%Y%m%d-%R 二、实现对CPU的监控 #!/bin/bash logdir=/var/log logfile=$logdir/cpucheck.log if [ -f $logfile ] then echo "logfile is exist !" else touch $logfile fi for cpucheck in `sar -u 2 2 |awk '{print $NF}'|sed '1,3d'|sed 's/\([0-9]*\)\..*/\1/g'` do if [ $cpucheck -le 10 ]; then /bin/mail -s "$HOSTNAME `date` cpu USE 90%" bo@future.com < /fileawk -- -f source@watchout.com echo cpu Use 90% send post to admin. else echo "cpu up to snuff" >> $logfile echo cpu up to snuff! fi done 注: 对sar 理解不深,有错误之处请指出,谢谢! 三、服务器上有两块网块,一块配有电信网关eth0,另一块配有网通的网关eth1,正常的用eth1,网通出现问题时,自动切换到电信。 root:/root>cat gateWin.sh #!/bin/bash win=`ping -c 10 192.168.1.138 |grep From |wc -l` winstatu=`ping -c 10 192.168.1.138 |grep From |awk '{print $1}'|tail -n 1` if [ "$winstatu" = From -a "$win" -gt 7 ]; then echo "`date +%y-%m-%d-%R` network error " >> /var/log/gate.log #echo "NETWORKING=yes" > /etc/sysconfig/network #echo "HOSTNAME=dns.secure.net" >> /etc/sysconfig/network #echo "GATEWAY=11.23.55.77" >> /etc/sysconfig/network #/bin/mail -s else echo "`date +%y-%m-%d-%R` network good" >> /var/log/gate.log fi 四、qmail 配置过程参考http://www.qmailrocks.org/install_rh.htm webmail 用的是igenus 1、手工删除队列 使用qmailctl queue 查看邮件队列,如下信息 [root@test-linux queue]# qmailctl queue messages in queue: 174 messages in queue but not yet preprocessed: 0 4 Feb 2009 22:52:30 GMT #363764 1722 <> remote so@succine.com 5 Feb 2009 16:07:21 GMT #366929 3162 <> remote courtneyjane@nc.rr.com 5 Feb 2009 11:00:30 GMT #369885 2429 <> remote michaelerkens@ampen.de 5 Feb 2009 08:29:29 GMT #366931 18577 <> remote harrell7q@bergencountycontractors.com 4 Feb 2009 23:14:45 GMT #364400 1737 <> remote plvijayan@successreviews.net 4 Feb 2009 22:52:01 GMT #363767 1779 <> remote successwebsite.com87ways_order@successwebsite.com #363764 #366929 ……以及都是邮件存在的唯一ID 可以在邮件队列目录下找到这个ID的文件 可以使用find /var/qmail/queue/ -name 363764 -exec rm {} \; 删除队列中某一封邮件 如何一次性删除所有邮件队列,我是采用了下面的方法写一个小脚本 #!/bin/bash qmailctl stop ID=`qmailctl queue |grep "#" |awk '{ print $6 }' |sed s/#//` for i in $ID do #qmailctl stop find /var/qmail/queue/ -name $i -exec rm {} \; #qmailctl start done qmailctl start 2、安装qmail-remove程序删除 下载安装qmail-remove源码包,安装源码包的三部曲。 有一个疑问是上面的红色字体是否代表投递邮件的大小? 五、当文件修改时自动邮件到指定的帐户 #!/bin/bash # . name change.sh # function if change zhou send mail ! while ls > /dev/null do YuanLaiTime=`stat zhou |grep Modify |awk '{print $3}' |awk -F "." '{print $1}' |sed s/://g` sleep 30 ChangeTime=`stat zhou |grep Modify |awk '{print $3}' |awk -F "." '{print $1}' |sed s/://g` if [ $YuanLaiTime -ne $ChangeTime ]; then echo Error >> /tmp/fileEr.log /bin/mail -s "file change " bo@kuailel23.com < /tmp/fileEr.log -- -f ce@watchout.com else echo OK >> /tmp/fileOK.log fi done 六、ping #!/bin/bash # function check DNS . name is ping.sh . tim=`date +%Y%m%d-%H` oldtim=`date -d '-60 day' +%Y%m%d-%H` touch /fgn/ping/ping.$tim.txt cd /fgn/ping if [ -f ping.$tim.txt ]; then for i in 1.2.2.6 2.3.1.0 do # touch /tmp/ping/ping.$tim.txt date +%Y%m%d-%H%M%S >> /fgn/ping/ping.$tim.txt ping $i -c 10 >> /fgn/ping/ping.$tim.txt done rm -f /fgn/ping/ping.$oldtim.txt fi |
相关文章推荐
- Shell测试运算和流程控制语句 监控disk、cpu和处理qmail邮件队列
- shell:条件测试操作与流程控制语句
- shell--条件测试语句和流程控制语句的使用
- 04-shell变量测试语句流程控制for循环
- shell 流程控制语句测试
- shell入门之流程控制语句
- Linux的Shell脚本中IF流程控制语句的基本语法
- 添加自定义监控项目配置邮件告警测试告警不发邮件的问题处理
- shell-6-退出状态与流程控制语句(if;test;case命令)
- 十六周一次课 2018.02.02 添加自定义监控项目、配置邮件告警、测试告警、不发邮件的问题处理
- Shell脚本[运算表达式,条件控制语句]
- 【Linux学习笔记】Shell 基础(3) — Shell流程控制语句
- 添加自定义监控项目、配置邮件告警、测试告警、不发邮件的问题处理
- linux中shell五种流程控制语句介绍
- shell流程控制语句 if while for case
- 【Unix/Linux.Shell Script】Shell Script程序的流程控制语句
- shell中的流程控制语句
- shell入门之流程控制语句
- 66.添加自定义监控项目 配置邮件告警与测试及处理问题
- Linux学习之Shell--第四天:Shell流程控制-循环语句for