if语法案例
if语法案例
1. 判断系统剩余内存
开发判断系统剩余内存的脚本,小于100M邮件报警给管理员,3分钟执行一次
- 思路:
- 命令行实现获取系统剩余内存值的方法
- 邮件保健设置
- 判断,达到要求报警
- 定时任务配置
1) 脚本正文
cat /server/scripts/t3.sh
#!/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)端口监控命令
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)远端监控命令
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)进程监控
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
$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的更多参考脚本
过滤端口后对比[不推荐]
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" ]
说明:比较数值改为比较字符串,比上一个脚本好一点,但是仍然麻烦
过滤进程或端口对比[推荐]
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判断端口[推荐]
[ `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转换成数值比较,推荐的方法
[ `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
#!/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访问来进行检测,首先都需要再命令行执行成功了,放到脚本里面才是正确的
取端口然后对比数值,不推荐,端口不存在易报错
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远程监测方法,推荐
[ `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远程监测方法,推荐
[ `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" ]
说明:方法略麻烦但是结果最准确,使用与数据库及更深层次的对网站集群后端各个应用的检测
if语法案例的更多相关文章
- nodeJs学习-10 模板引擎 ejs语法案例
ejs语法案例 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <t ...
- 关于Ruby常用语法案例累积
变量问题: 类变量和方法变量的区别是什么? 类变量:可以直接使用 方法变量:需要实例化后,才能使用该变量 案例一: class Person @@name = "Tom" @@na ...
- Retrofit2 简介 语法 案例
简介 官网:http://square.github.io/retrofit/ GitHub:https://github.com/square/retrofit/ compile 'com.squa ...
- oracle 之 定时任务,存储过程和游标等语法案例
--定时任务 declare job20 number; begin sys.dbms_job.submit(job20,'test1;',sysdate,'sysdate+1'); end; --存 ...
- Mysql_以案例为基准之查询
查询数据操作
- OAF_EO系列7 - OAException异常处理及实现(案例)
2014-06-12 Created By BaoXinjian
- Elasticsearch系列---实战搜索语法
概要 本篇介绍Query DSL的语法案例,查询语句的调试,以及排序的相关内容. 基本语法 空查询 最简单的搜索命令,不指定索引和类型的空搜索,它将返回集群下所有索引的所有文档(默认显示10条): G ...
- doy05循环语法学习笔记
doy05循环语法学习笔记 一.while循环语法: 1.基本用法示例 x = 1 while x <= 5: print(x) x += 1 2.死循环:永远不结束的循环 如:while Tr ...
- ( 译、持续更新 ) JavaScript 上分小技巧(一)
感谢好友破狼提供的这篇好文章,也感谢写这些知识点的作者们和将他们整理到一起的作者.这是github上的一篇文章,在这里本兽也就只做翻译,由于本兽英语水平和编程能力都不咋地,如有不好的地方也请多理解体谅 ...
- OAF_OAF Exception Handling异常处理(概念)
2014-06-12 Created By BaoXinjian
随机推荐
- python学习第四周总结
异常常见类型 异常处理语法结构 异常补充处理 异常处理实战应用 生成器对象 自定义生成器range()功能 yield冷门用法 生成器表达式 模块简介 模块的分类 导入模块的两种句式 导入模块补充说明 ...
- 面向对象程序设计(三):C++模板operator Type类型转换
学习算法的时候遇到了一个不认识的写法,去网上查了查,看到有一篇写的挺好的,转载过来了 C++隐式类型转换运算符operator type()用法详解 对象向基本数据类型转换: 点击查看代码 #incl ...
- 简单了解C语言如何构建多文件项目
简单理解C语言如何构建工程 首先我们最好有一个好用的编辑器,vscode也好,visual studio也罢,dev也行,这里我们使用的是code::block: 一.了解C语言工程的构建原理 首 ...
- 真正“搞”懂HTTP协议13之HTTP2
在前面的章节,我们把HTTP/1.1的大部分核心内容都过了一遍,并且给出了基于Node环境的一部分示例代码,想必大家对HTTP/1.1已经不再陌生,那么HTTP/1.1的学习基本上就结束了.这两篇文章 ...
- freeRTOS检测栈溢出
将FreeRTOSConfig.h里面的configCHECK_FOR_STACK_OVERFLOW设置为2. 随便一个文件里,加入 #include "task.h" void ...
- Spring(Spring的读取外部资源- p 命名空间)
Spring读取外部资源 实际开发中,数据库的资源一般会单独保存起来.一般会保存到后缀为properties的文件中,方便维护和修改,如果Spring加载资源,就需要在spring.xml中读取pro ...
- 微信小程序项目中使用icon图标
效果: 步骤: 1.先让ui负责人把你的账号加入到项目中,加入到项目中后就可以在icon图标库中看到该项目 2.在小程序中使用 新建一个view,在上面加一个class,复制icon名字上去即可,注意 ...
- Cesium计算三角形面积(十)
function triangleArea(p0, p1, p2) { //利用subtract计算出两个向量 let v0=Cesium.Cartesian3.subtract(p0,p1,newC ...
- C语言使用fopen出现C4996错误解决方法
Visual Studio 不安全提醒屏蔽方法: 打开项目----项目属性---配置属性----C/C++ ----预处理器----预处理定义,添加 _CRT_SECURE_NO_DEPRECATE ...
- CCRD_TOC_2008年第7和第8期(ACR专辑)
中信国健临床通讯 2008年第7.第8期合刊 ACR专辑 目 录 强直性脊柱炎 1. 一项随机对照和开放性延伸期试验:TNF拮抗剂治疗放射学前中轴型脊柱关节病 Boettger MK, et al ...