Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ammonit golang重新启动缓慢且状态不存在_Go_Monit - Fatal编程技术网

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

Ammonit golang重新启动缓慢且状态不存在,go,monit,Go,Monit,我创建的应用程序必须在崩溃时重新启动golang站点 $ 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/

我创建的应用程序必须在崩溃时重新启动
golang站点

$ 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`"
一开始还可以

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站点

我有两个问题:

  • 站点重启相当慢:虽然在配置中我设置了超时5秒,但需要1分钟
  • monit
    中的
    站点
    的状态变为
    不存在
    ,即使在站点实际重新启动之后。我猜这是因为在杀死并重新启动站点后,其
    pid
    随机变化,但我不知道如何克服这一点
  • 重新启动后的状态:

    Process 'site'
          status                            Does not exist
          monitoring status                 Monitored
          data collected                    Thu, 05 Mar 2015 08:04:44
    
    如何减少重新启动的时间以及如何修复站点的监控状态

    monit
    log:

    [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没有任何订阅机制来即时发现进程是否已死亡

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

    在monitrc中检查此配置,它是使用
    set daemon
    指令配置的,例如,如果您希望每5秒检查一次状态,则应设置:

    set daemon 5
    
    在每个循环中,它更新其状态,并根据需要执行操作。因此,如果它检测到该进程不存在,它将报告
    不存在
    ,直到下一个轮询周期,即使它已经需要决策来重新启动它

    start daemon
    指令中的
    timeout
    与此轮询周期无关,这是monit将给予服务的启动时间。如果服务在此时间内没有启动,monit将报告它


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

    如果您能显示一些代码,这会有所帮助。为了捕获像sigint这样的信号,您需要一些代码,请参阅,您还可以尝试从go程序内部通过os.Getpid()编写PID。尝试从延迟恢复块中的go程序内部删除PID文件,并在中断信号时,在进程(重新启动)时编写新的PID文件开始。@metakeule请参阅上面的
    更新
    更新1
    。我打印了站点代码并检查了关于删除PID文件的假设。我手动删除了它。不幸的是,删除PID文件并没有帮助。