mmonit golang重启速度慢,状态不存在

我创建了应用程序,它必须在崩溃时重新启动golang site

$ cd /etc/monit/conf.d 
$ vim checkSite 

它使用nohup启动程序并将其pid保存到文件中:

check process site with pidfile /root/go/path/to/goSite/run.pid
    start program = "/bin/bash -c 'cd /root/go/path/to/goSitePath; nohup ./goSite > /dev/null 2>&1 & echo $! > run.pid'" with timeout 5 seconds
    stop program = "/bin/kill -9 `cat /root/go/path/to/goSitePath/run.pid`"

它开始OK。

Process 'site'
  status                            Running
  monitoring status                 Monitored
  pid                               29723
  parent pid                        1
  uptime                            2m 
  children                          0
  memory kilobytes                  8592
  memory kilobytes total            8592
  memory percent                    0.4%
  memory percent total              0.4%
  cpu percent                       0.0%
  cpu percent total                 0.0%
  data collected                    Thu, 05 Mar 2015 07:20:32

然后为了测试它如何在崩溃时重新启动,我手动杀死了golang site

这里我有两个问题:

  • 站点重新启动相当慢:它需要1分钟,尽管在配置中我设置with timeout 5 seconds
  • monitsite状态即使在站点重新启动后Does not exist 。 我想这是因为在杀死并重新启动网站的pid会随机更改,但如何克服这一点我不知道。
  • 重启后的状态:

    Process 'site'
          status                            Does not exist
          monitoring status                 Monitored
          data collected                    Thu, 05 Mar 2015 08:04:44
    

    如何减少重新启动时间以及如何修复站点的monit status

    monit日志:

    [Mar  5 08:04:44] error    : 'site' process is not running
    [Mar  5 08:04:44] info     : 'site' trying to restart
    [Mar  5 08:04:44] info     : 'site' start: /bin/bash
    [Mar  5 08:06:44] info     : 'site' process is running with pid 31479
    

    更新

    我的golang网站相当简单:

    package main
    
    import (
        "fmt"
        "github.com/go-martini/martini"
    )
    
    func main() {
        m := martini.Classic()
    
        m.Get("/", func() {
            fmt.Println("main page")
        })
    
        m.Run()
    }
    

    更新2

    我试图通过删除pid文件本身来增加monit重载我的golang站点的速度。 假设我kill 29723 && rm run.pid并打开计时器以计算站点再次访问的时间。 花了85秒。 所以删除pid文件无助于增加重新加载站点的速度。


    monit没有任何订阅机制可以立即发现进程是否已经死亡。

    在守护进程模式下,monit通过定期轮询所有配置规则的状态来工作,轮询周期在守护进程启动时配置,在某些Linux发行版中默认为2分钟,这意味着在这种情况下,monit可能需要等待2分钟采取任何行动。

    例如,如果你想每隔5秒检查一次状态,你可以在你的monitrc中检查这个配置,并使用set daemon指令配置它,然后你应该设置:

    set daemon 5
    

    在每个周期它会更新其状态,并根据需要执行操作。 因此,如果它检测到进程不存在,它将报告直到下一个轮询周期Does not exist ,即使它已经采取决定来重新启动它。

    start daemon指令中的timeout与这个轮询循环没有任何关系,这是监视服务启动的时间。 如果服务不在这个时候开始,monit会报告它。

    如果monit不符合您的要求,您也可以尝试supervisord,即始终了解执行的程序的状态。

    链接地址: http://www.djcxy.com/p/83999.html

    上一篇: mmonit golang restarting slow and status does not exist

    下一篇: transclude doesn't work