Shell测试运算和流程控制语句 监控disk、cpu和处理qmail邮件队列

Shell测试运算和流程控制语句 监控disk、cpu和处理qmail邮件队列
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" [email protected] < /fileawk -- -f [email protected]
#/bin/mail -s "fileawk over" [email protected] < /fileawk -- -f [email protected]
#cat /fileawk | /bin/mail -s "$HOSTNAME$ Filesystem over" [email protected] -- -f [email protected]
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 [email protected]
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 [email protected]
5 Feb 2009 16:07:21 GMT #366929 3162 <>
        remote [email protected]
5 Feb 2009 11:00:30 GMT #369885 2429 <>
        remote [email protected]
5 Feb 2009 08:29:29 GMT #366931 18577 <>
        remote [email protected]
4 Feb 2009 23:14:45 GMT #364400 1737 <>
        remote [email protected]
4 Feb 2009 22:52:01 GMT #363767 1779 <>
        remote [email protected]
#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 " [email protected] < /tmp/fileEr.log -- -f [email protected]
     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,cpu,队列,disk,qmail)