多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
[toc] # **if语法案例** ## **1. 判断系统剩余内存** 开发判断系统剩余内存的脚本,小于100M邮件报警给管理员,3分钟执行一次 * 思路: 1. 命令行实现获取系统剩余内存值的方法 1. 邮件保健设置 1. 判断,达到要求报警 1. 定时任务配置 ### 1) 脚本正文 * `cat /server/scripts/t3.sh` ```shell #!/bin/bash Mem=`free -m|awk 'NR==3 {print $4}'` Chars="current memory is $Mem" #Mail=`mail -s "`date +%F-%T`menory error" noah@mail.com $Chars` Mail=`echo "menory error to send noah@mail.com $Chars"` #没有配置邮件客户端,所以用echo命令模拟了发送邮件, if [ $Mem -lt 1000 ] then echo $Chars echo $Mail fi ``` ### 2) 执行结果 >*`sh /server/scripts/t3.sh ` current memory is 866 menory error to send noah@mail.com current memory is 866 然后加入定时任务中执行即可 ` */3 * * * * /bin/bash /server/scripts/t3.sh` ## **2.监控web和数据库的方法** 用if语句增对nginx或mysql数据库检查服务是否正常,如果未启动则启动服务 ### 1) 端口监控 在服务器本地监控服务端口,常见命令netstat、ss、lsof 从远端监控服务器本地端口,常见命令telnet、nmap、nc ### 2) 进程监控 适用于本地服务器,过滤注意使用进程名 ### 3) 客户端模拟 使用wget或curl命令测试,如果检测数据库,需要转为通过web服务器去访问数据库 利用返回值($?)进行判断 获取特殊字符串以进行判断(需要事先开发好程序) 根据http响应header的情况进行判断 ### 4) 数据库判断* 通过mysql客户端连接数据库,根据返回值或返回内容判断,如: `mysql -uroot -poldboy123 -e "select version();" &>/dev/null;echo $?` >对端口进程等进行判断时,尽量先通过grep过滤端口和进程特殊标记字符串,然后结合wc将过滤到的结果转成行数在比较, 如果单纯的根据具体的列取具体的值判断会很麻烦,如果一定要用,也要尽量用字符串比较的语法, 不要用数字比较 ## **3.mysql数据库检测命令演示** ### 1)端口监控命令 ```shell netstat -lnt|grep 3306|awk -F "[ :]+" '{print $5}' #端口比较,不推荐 netstat -lntup|grep mysql|wc -l ss -lntup|grep mysql|wc -l ss -lntup|grep mysql|wc -l lsof -i tcp:3306|wc -l ``` >不推荐直接数字比较法,推荐过滤结果用wc转换后比较的方法 ### 2)远端监控命令 ```shell nmap 127.0.0.1 -p 3306|grep open|wc -l echo -e "\n"|telnet 127.0.0.1 3306 2>/dev/null|grep Connected|wc -l nc -w 2 127.0.0.1 3306 &>/dev/null;echo $? ``` ### 3)进程监控 ```shell ps -ef|grep mysql|grep -v grep|wc -l ``` ### 4)客户端模拟监控 > * `wget --spider --timeout=10 --tries=2 www.baidu.com &>/dev/null;echo $?` --spider参数是模拟爬取,不真实下载数据 --tries参数是重试次数 > * `curl -s -o /dev/null http://www.baidu.com;echo $?` -s为沉默模式,-o /dev/null表示将输出定向到空 ### 5)通过程序访问数据库监控(以PHP) * cat /server/scripts/testmysql.php ```php <?php $link_id=mysql_connect('locahost','root','luogang') or mysql_error(); if ($link_id) { echo "mysql successful by luogang !"; } else { echo mysql_error() } ?> ``` > 将此程序放到了lnmp服务器的站点目录,然后curl访问 或者在php服务器端执行本程序 对返回结果进行关键字过滤即可 ## **4.监控MySQL的更多参考脚本** ### 过滤端口后对比[不推荐] ```shell if [ `netstat -lnt|grep 3306|awk -F "[ :]+" '{print $5}'` -eq 3306 ] then echo "MySQL is Running." else echo "MySQL is Stopped." /etc/init.d/mysqld start fi ``` > 说明:此法不建议,若端口不存在会报错,不要用具体的值比较,用wc转换后比较行数 ```if [ "`netstat -lnt|grep 3306|awk -F "[ :]+" '{print $5}'`" = "3306" ]``` 说明:比较数值改为比较字符串,比上一个脚本好一点,但是仍然麻烦 ### 过滤进程或端口对比[推荐] ```shell if [ `netstat -lntup|grep mysqld|wc -l` -gt 0 ] then echo "MySQL is Running." else echo "MySQL is Stopped." /etc/init.d/mysqld start fi ``` >说明:过滤进程名并wc转换成数值,推荐的方法 ```if [ `lsof -i tcp:3306|wc -l` -gt 0 ]``` 说明:过滤端口转换成数值,推荐的方法 ```if [ `ps -ef|grep -v grep|grep mysql|wc -l` -ge 1 ]``` 说明:比较传统的方法,grep过滤后对比,但是要过滤掉自己 ### nmap或nc判断端口[推荐] ```shell [ `rpm -qa nmap|wc -l` -lt 1 ] && yum install nmap -y &>/dev/null if [ `nmap 127.0.0.1 -p 3306 2>/dev/null|grep open|wc -l` -gt 0 ] then echo "MySQL is Running." else echo "MySQL is Stopped." /etc/init.d/mysqld start fi ``` > 说明:先判断nmap是否安装,在进行远端的端口检查,并用wc转换成数值比较,推荐的方法 ```shell [ `rpm -qa nc|wc -l` -lt 1 ] && yum install nc -y &>/dev/null if [ `nc -w 2 127.0.0.1 3306 &>/dev/null&&echo ok|grep ok|wc -l` -gt 0 ] ``` > 说明:特殊方法,nc执行成功,则输出对应的ok,让后过滤ok并判断,好思路 ## **5.rsync启停脚本** ### 脚本内容 * cat /etc/init.d/rsync.sh ```shell #!/bin/sh # chkconfig: 2345 20 80 # description rsyncd startup scripts by oldby. #设置可以通过chkconfig管理自启动 if [ $# -ne 1 ] then echo $"usage:$0{start|stop|restart}" exit 1 fi #传参个数不等于1,则提示并退出 if [ "$1" = "start" ] then rsync --daemon if [ `netstat -lntup|grep rsync|wc -l` -ge 1 ] then echo "rsyncd is started." exit 0 fi #如果传参是start,则执行启动命令,并过滤进行并判断行数,大于1则启动成功,输出信息并退出 elif [ "$1" = "stop" ] then pkill rsync if [ `netstat -lntup|grep rsync|wc -l` -eq 0 ] then echo "rsyncd is stopped." exit 0 fi #如果传参是stop,则杀掉rsync进程,过滤进程判断行数,如果为则关闭成功 elif [ "$1" = "restart" ] then pkill rsync sleep 2 rsync --daemon #如果是restart参数,则杀掉进程并再开启进程 else echo $"usage:$0{start|stop|restart}" exit 1 fi #如果传入的参数不是以上3个字符串,则提示错误并退出 ``` ## **6.监控nginx服务异常** 同监控mysql一样,也使用端口、进程或wget/curl访问来进行检测,首先都需要再命令行执行成功了,放到脚本里面才是正确的 ### 取端口然后对比数值,不推荐,端口不存在易报错 ```shell if [ `netstat -lnt|grep 80|awk -F "[ :]+" '{print $5}'` -eq 80 ] then echo "Nginx is Running." else echo "Nginx is Stopped." /etc/init.d/nginx start fi ``` ### 读端口后当作字符串比较,取值麻烦 ```if [ "`netstat -lnt|grep 80|awk -F "[ :]+" '{print $5}'`" = "80" ]``` ### 过滤进行后转换为数值,**推荐** ```if [ `netstat -lntup|grep nginx|wc -l` -gt 0 ]``` ### 过滤端口转换为数值,**推荐** ```if [ `lsof -i tcp:80|wc -l` -gt 0 ]``` ### nmap远程监测方法,**推荐** ```shell [ `rpm -qa nmap|wc -l` -lt 1 ] && yum install nmap -y &>/dev/null if [ `nmap 127.0.0.1 -p 80 2>/dev/null|grep open|wc -l` -gt 0 ] ``` ### nc远程监测方法,**推荐** ```shell [ `rpm -qa nc|wc -l` -lt 1 ] && yum install nc -y &>/dev/null if [ `nc -w 2 127.0.0.1 80 &>/dev/null&&echo ok|grep ok|wc -l` -gt 0 ] ``` ### 过滤进程并排查字符 ```if [ `ps -ef|grep -v grep|grep nginx|wc -l` -ge 1 ]``` ### 远程获取状态码然后做正则匹配,双中括号的用法 ```if [[ `curl -I -s -o /dev/null -w "%{http_code}\n" http://127.0.0.1` =~ [23]0[012] ]]``` ### 远程通过egrep过滤状态码,然后转换为数值,**推荐** ```if [ `curl -I http://127.0.0.1 2>/dev/null|head -1|egrep "200|302|301"|wc -l` -eq 1 ]``` ### 远程访问网站,根据返回的结果和其他的值进行比较 ```if [ "`curl -s http://127.0.0.1`" = "oldboy" ]``` 说明:方法略麻烦但是结果最准确,使用与数据库及更深层次的对网站集群后端各个应用的检测