0
点赞
收藏
分享

微信扫一扫

简单的进程守护程序

项目突然上线了一个测试包,这个程序包老是会突然就死掉,虽然已经打回开发那边改了,但是服务这边又不允许回退版本,所以我只能顶着个烂包来干活了。zabbix那边可以监控,但是很多时候我在外面,无法跑回去重启,所以打算写一个简单的进程守护程序来监控它
#
资产上有jdk,也有py和go环境,脚本类的程序的话就不用java写了,python的版本比较低,我也没有root权限去升级python版本,所以用python来完成这个脚本的话可能会遇到很多不兼容的写法,最后选择了go来写
#
我的思路是:启动一个程序,每隔20秒打印一次该进程的pid和状态到日志中,假如检测不到该进程的pid,则重新启动该程序。假如检查到进程状态为T或Z,就重新启动该程序。假如检测到程序日志文件长时间大小没有增加,则重新启动(此步未完成,因为这个程序包的日志正常情况下不持续打印)
#
为了方便演示,我就随便开个tomcat,来模拟一个进程,先上代码:

package main

import(
"fmt"
"os/exec"
"bytes"
"time"
"strings"
)

func main() {

for {

  var outInfo bytes.Buffer
  //用exec.Command来调用linux命令,这条linux命令如果被调用会打印出pid和状态
  cmd := exec.Command("bash", "-c", "ps aux|grep tomcat|grep -v grep|awk '{print $2,$8}'")
  //接收输出
  cmd.Stdout = &outInfo
  //执行命令
  cmd.Run()
  output := outInfo.String()

  //这里加个时间,因为要打印到日志里,没有时间的话定位不到程序什么时候断了
  fmt.Print(time.Now().Format("2006-01-02 15:04:05"))

  //判断接收到的输出值是否为空
  if output=="" {
   //空的话说明程序没有启动,调用下面写好的启动函数
   startProcess()  

  }else if status:= strings.Contains(output,"T");status{

     reloadProcess()

   }else if status:= strings.Contains(output,"Z");status{

       reloadProcess()

    }else if status:= strings.Contains(output,"X");status{

        reloadProcess()

     }else{

         fmt.Println(":[INFO]tomcat程序存在!")
      }
   //由于是有执行操作的死循环,来个延时,这里设置20秒
   time.Sleep(time.Duration(20)*time.Second)
   }
}

func startProcess(){
  var outInfo bytes.Buffer
  fmt.Println(":[ERROR]tomca未启动,正在自动启动中...")
  //这里调用了启动tomcat的命令
  cmd := exec.Command("bash", "-c", "sh apache-tomcat-8.5.79/bin/startup.sh")
  cmd.Stdout = &outInfo
  cmd.Run()
  fmt.Println(outInfo.String())
}

func reloadProcess(){
  var outInfo bytes.Buffer
  fmt.Println(":[ERROR]进程状态异常!正在重新启动...")
  //这里调用了杀死进程和重新启动的命令
  cmd_stop := exec.Command("bash", "-c", "ps aux|grep |awk '{print $2}'|xargs kill -9")
  cmd_start := exec.Command("bash", "-c", "sh apache-tomcat-8.5.79/bin/startup.sh")
  cmd_start.Stdout = &outInfo
  cmd_stop.Run()
  cmd_start.Run()
  fmt.Println(outInfo.String())
}

我将它写成了一个test.go文件,在终端执行nohup go run test.go >> run.log 2>&1 &
image.png
ps一下这个脚本文件是否存在ps aux|grep test.go
image.png
可以看到脚本已经跑起来了,现在去日志看看tail -f -n 100 run.log
image.png
可以看到脚本一直在监控着tomcat,现在我们把tomcat进程杀掉,然后再看看情况:
image.png
tomcat已经杀掉了,模拟程序停掉的情况,现在返回日志看看情况:
image.png
可以看到日志中检测到tomcat停止,然后自动把它给启动了,在ps一下看看tomcat是否已经启动:
image.png
image.png
可以看到进程是在的,页面也可以正常打开。
#
基本上功能就是这样,由于只有两三个小时的时间来写这个脚本,很多地方没有完善,使用者可以根据个人编码习惯稍加修改,至于根据日志文件大小的增加来判断程序是否在运行还是看个人的业务吧,此脚本只需修改调用的linux命令和延时的时间便可使用

举报

相关推荐

0 条评论