使用 Linux Shell 脚本定时监控 web 服务(进程挂掉自动重启服务和检测首页是否能返回状态码 200 )

最近 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 – 重启原因,其中重启原因有两种:

  1. process not found :检测到相关进程不存在;
  2. Homde Page code != 200 :访问首页时返回的状态码不是 200 。

 

其他相关文章:

打赏作者
这里是 “ CCIE 工程师社区 ” 官方的捐款通道,您是否可以考虑请我们喝杯咖啡呢?

您的支持将鼓励我们继续创作!

[微信] 扫描二维码打赏

[支付宝] 扫描二维码打赏

Was this article helpful?

Related Articles

Leave A Comment?

This site uses Akismet to reduce spam. Learn how your comment data is processed.