最近 Ricky 这边有两台跑在 CentOS Linux 上的 node.js 服务器,由于 node.js 服务不是很稳定(因为我不是开发,之前也没怎么用过),经常出现进程挂掉或者进程还在但是网页无法访问的情况,于是临时写了一个 Linux Shell 脚本定时监控 web 服务,Linux Shell 脚本主要实现以下功能:
- 每 30 秒检测一次;
- 当检测到进程挂掉时,自动重启相关进程;
- 当检测到进程还在但是首页无法正常访问时,自动重启相关进程;
- 将自动重启的时间和原因记录到日志文件中。
部署:
1、编写脚本,在命令行界面输入:
[root@host ~]# vi /root/port.sh
键入小写字母 i ,进入编辑模式,将以下脚本复制粘贴进去(请根据实际需要进行相应地修改):
#!/bin/bash # 加载环境变量,否则 npm 命令可能会出现无法执行的情况 source /etc/profile # node.js 监听的端口号为 8088 ,检查 8088 端口是否有进程在监听 port=`netstat -ntlp | grep -c ":8088"` #echo $port # 如果 8088 端口没有进程在监听 if [ "$port" = "0" ]; then # 则启动 node.js 的进程 cd /usr/local/node/6.10.0 && npm start & # 将日志写入日志文件 echo $(date "+%F %H:%M:%S") - already restart port - process not found >> /root/port.log # 如果 8088 端口有进程在监听 else # 访问首页 http://127.0.0.1:8088/m/home ,并获取状态码 code=`curl -I -m 10 -o /dev/null -s -w %{http_code} http://127.0.0.1:8088/m/home` #echo $code # 如果返回的状态码不是 200 if [ "$code" != "200" ]; then # 则先 kill 掉所有 node.js 的进程 ps aux|grep "node server" |grep -v grep|awk '{print $2}'|xargs kill -9 # 再启动 node.js 的进程 cd /usr/local/node/6.10.0 && npm start & # 将日志写入日志文件 echo $(date "+%F %H:%M:%S") - already restart port - Homde Page code != 200 >> /root/port.log fi fi
按一次 ESC 键退出编辑模式,然后键入 “ :wq ” 保存并退出。
这里解释说明一下使用到的 curl 命令:
curl -I -m 10 -o /dev/null -s -w %{http_code} http://127.0.0.1:8088/m/home
- -I :只显示请求头信息;
- -m 10 :设置最大传输时间,单位是秒;
- -o /dev/null :屏蔽原有输出信息;
- -s :silent 模式,不输出任何东西;
- -w %{http_code} :控制额外输出。
2、为上述脚本赋予可执行权限,并创建日志文件:
[root@host ~]# chmod +x /root/port.sh [root@host ~]# touch /root/port.log
3、让上述脚本每 30 秒钟自动运行一次,在命令行界面输入:
[root@host ~]# crontab -e
先键入大写字母 G ,跳到最后一行;再键入小写字母 o ,插入新的一行,并将以下命令复制粘贴进去:
* * * * * sleep 5; /root/port.sh * * * * * sleep 35; /root/port.sh
如果需要按分钟来执行,只需要这么写就可以了:
# 每分钟执行一次 */1 * * * * /root/port.sh # 每 3 分钟执行一次 */3 * * * * /root/port.sh # 每 30 分钟执行一次 */30 * * * * /root/port.sh
按一次 ESC 键退出编辑模式,然后键入 “ :wq ” 保存并退出。
因为 crontab 的最小时间单位是分钟,所以采用 sleep 的方式来实现秒级的运行。即同时创建两个自动任务:
- 第一个任务每分钟执行一次,是先休眠 5 秒钟后再执行 port.sh ;
- 另一个任务也是每分钟执行一次,是先休眠 35 秒钟后再执行 port.sh 。
这样就相当于只有一个任务,且每 30 秒钟执行一次。
至此,部署完成。
日志格式说明:
[root@host ~]# cat /root/port.log 2018-06-03 23:04:06 - already restart port - process not found 2018-06-03 23:15:37 - already restart port - Homde Page code != 200 [root@host ~]#
日志格式为:时间 – already restart port – 重启原因,其中重启原因有两种:
- process not found :检测到相关进程不存在;
- Homde Page code != 200 :访问首页时返回的状态码不是 200 。
其他相关文章:
发表评论?