使用自动化脚本shell作为监测系统心跳是非常常用的方法。这里玩一个套娃,看看虚拟系统的运行情况。
整个shell脚本如下:
#设置变量,注意awk是对返回值按条件切取,使用两次awk是为了切取第三列第二行的内容。
state=`virsh list |awk '{print $3}'`
states=`echo $state|awk '{print $2}'`
if [ "$states"x = "running"x ];then
echo "系统正常"
else
echo "系统异常"
#执行相关命令
virsh reset x86
fi
下面我对这个脚本进行注释,首先我们呀了解echo的意义,跟php的echo不同,echo内是可以执行的。
echo命令用于在shell中打印shell变量的值,或者直接输出指定的字符串。
在 echo 函数中,可以同时输出多个字符串,而在 print 函数中则只可以同时输出一个字符串。同时,echo函数并不需要圆括号,所以echo函数更像是语句而不像是函数。
echo 和 print 都不是函数,而是语言结构,所以圆括号都不是必需的。他们的区别在于:
(1) echo可以输出多个字符串,像下面这样:
echo 'a','b','c';
如果你非要加上圆括号,注意写成echo ('a','b','c');是错误的,应该写成:
echo ('a'),('b'),('c');
它没有像函数的行为,所以不能用于函数的上下文
(2) print只能输出一个字符串,它可以表现得像一个函数,比如你可以如下使用:
$ret = print 'Hello World';
所有它能用在更复杂的表达式中。
另外,echo的效率相对比较快~
awk '{print $3}'
#代表前面那个第三列文字。
改良后的自动化脚本,通过监控虚拟环境网络状态,来按需强制重启虚拟环境。
#!/bin/env sh
status_code=$(curl -s -o /dev/null -w "%{http_code}" -X GET "http://192.168.0.106:8080")
if [[ $status_code == 200 ]]; then
echo "success"
else
virsh reset x86
fi
基于设备情况的改良版,假如设备根本不联网,重启也没用,首选要确定百度是通的,然后自己网站打不开的情况,才需要重启。
#!/bin/env sh
webcode=$(curl -s -o /dev/null -w "%{http_code}" -X GET "http://www.baidu.com")
selfcode=$(curl -s -o /dev/null -w "%{http_code}" -X GET "http://192.168.0.106:8080")
if [ $selfcode != 200 ]&&[ $webcode = 200 ]; then
virsh reset x86
else
echo "pass"
fi
进一步优化版
webcode=$(curl -s -o /dev/null -w "%{http_code}" http://www.baidu.com)
selfcode=$(curl -s -o /dev/null -w "%{http_code}" http://192.168.0.107:8080)
if [ $selfcode != 200 ]&&[ $webcode = 200 ]; then
virsh reset x86
fi
介绍版
#!/bin/env sh
webcode=$(curl -s -o /dev/null -w "%{http_code}" -X GET "http://www.baidu.com")
selfcode=$(curl -s -o /dev/null -w "%{http_code}" -X GET "http://192.168.0.107:8080")
if [ $selfcode != 200 ]&&[ $webcode = 200 ]; then
# 执行相应的自修复命令
else
echo "系统运行正常"
fi