负载高, 就自动重启
家里的路由器上 host blog, 有时候很不稳定, 比如说如果路由器上同时开bt 下载, 它的负载有可能会高, 有时候运行时间长了, nginx 或者 fastcgi 会使 CPU 飙升到100%.
为了保证 Blog 的稳定性, 首先在 dnsPod 上面做了 D监控, 一旦无法访问, 就微信/邮件通知. 另外路由器上每天凌晨会自动定时重启. 有时候重启真是灵丹妙药.
最近发现有时候 nginx 或者 fastcgi 进程有时候会使CPU 飙升, 导致 Blog 不能访问. 不过这些时候, 内部上网总是能保证的.
怎么解决这种偶尔的负载过高呢, 可以通过监控负载过高, 进行重启的方式进行. 于是有了下面的检测并重启的脚本.
[这里重启的是 host 这个blog 的路由器, 不是其它server 哦]
load=$(uptime | awk '{print $8}' | awk -F '.' '{print $1}')
if [ 1 -eq $load ];then
echo 'I am going to restart'
reboot
fi
其实这个 shell 脚本很简单, 取 uptime 命令输出的 15 分钟的CPU 负载, 一旦发现大于1, 就重启.
但是为了写这个脚本, 却经历坎坷. 其中遇到的困难有:
1) 这个负载值是一个有 2 位小数的浮点数, 一开始想用 shell 脚本的 if 去对比, 发现根本不能比, shell 脚本不支持浮点数对比;
2) 另外 if 那个数字的对比, 方括号和中间的数字之间必须有空格, 否则报错. [空格1 -eq $load空格].
这里为了使用整形对比, 还特地截取了其中的整形部分.