首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >mmonit golang重新启动缓慢且不存在状态

mmonit golang重新启动缓慢且不存在状态
EN

Stack Overflow用户
提问于 2015-03-05 04:23:35
回答 1查看 2.1K关注 0票数 7

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

代码语言:javascript
复制
$ cd /etc/monit/conf.d 
$ vim checkSite 

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

代码语言:javascript
复制
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`"

一开始还行。

代码语言:javascript
复制
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,但它需要1分钟
  2. sitemonit中的状态甚至在站点重新启动之后也会变成Does not exist。我猜这是因为在杀死和重新启动站点的pid是随机变化,但如何克服这一点,我不知道。

重新启动后的状态:

代码语言:javascript
复制
Process 'site'
      status                            Does not exist
      monitoring status                 Monitored
      data collected                    Thu, 05 Mar 2015 08:04:44

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

monit日志:

代码语言:javascript
复制
[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

更新

我的黄金网站相当简单:

代码语言:javascript
复制
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提高重新加载站点的速度。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-04-07 22:29:56

monit没有任何订阅机制来间接地发现进程是否已经死亡。

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

在监视器中检查此配置,它是用set daemon指令配置的,例如,如果您希望每5秒检查一次状态,那么应该设置:

代码语言:javascript
复制
set daemon 5

在每一个循环中,它都会更新其状态,并根据需要执行操作。因此,如果它检测到这个过程不存在,它将报告Does not exist直到下一个投票周期,即使它已经需要退出才能重新启动它。

timeout中的start daemon指令与这个轮询周期没有任何关系,这是monit给服务启动的时间。如果服务没有在这段时间启动,monit将报告它。

如果monit不符合您的要求,您也可以尝试监督d,这总是知道执行程序的状态。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28869977

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档