询问一个关于 golang经常自动重启

ccoding · · 2058 次点击
问题已解决,感谢楼上的各位的热心帮助,下面是我得解决方法,确定问题就在于systemd,当启动的时候 虽然日志成功,但是systemd并未收到信号量running,这个时候会启动一个一小时启动一次的方式,这个感兴趣的可以详细的了解 ```golang //导入一个包 go get github.com/coreos/go-systemd/daemon //看门狗,不用纠结logger,这个换成自己的日志输出或者,fmt打印都可以,每隔5秒告诉一次systemd健康状态,这个要使用 go 单独启动一个协成来执行 func main(){ //TDDO启动TCP服务监听 //启动看门狗 go goWatchSignal() for { conn, e := ln.Accept() if e != nil { if ne, ok := e.(net.Error); ok && ne.Temporary() { logrus.Error("接受到错误信息") continue } } go goHandlerConn(conn) } } func goWatchSignal() { //发送运行信号通知 _, err := daemon.SdNotify(false, daemon.SdNotifyReady) if err != nil { logger.Init("WatchSignal").Warn("SdNotifyReady-发送运行信号失败", zap.Reflect("err", err.Error())) } for { _, er := daemon.SdNotify(false, daemon.SdNotifyWatchdog) if er != nil { logger.Init("WatchSignal").Warn("SdNotifyWatchdog-发送指令异常", zap.Reflect("err", err.Error())) } time.Sleep(5 * time.Second) } } ```
#17
更多评论
在容易出错的地方要加上容错的机制,使用panic recover机制抓住错误信息就可以定位问题在哪里,然后再解决问题。 个人觉得常出错的地方有使用了nil的数据、数组越界了是最常见的,另外还有一些不容易发现的比如没有关闭链接之类的。 最好是能上源码,如果不关乎行业机密的话。
#1
panic 在日志里没有发现,有,我写个伪代码吧 ```golang func main() { for { conn, e := ln.Accept() if e != nil { if ne, ok := e.(net.Error); ok && ne.Temporary() { logger.Init("异常").Info("接收错误信息:%v" + fmt.Sprintf("accept temp err: %v", ne)) continue } } // 解析连接消息 路由模式开启 go goHandleConn(conn) } } func goHandleConn(conn net.Conn) { defer func() { if conn != nil { conn.Close() } if err := recover(); err != nil { //获取程序名称 appExeName := os.Args[0] pid := os.Getegid() logger.Init("POSP中台").Error("goHandleConn:引发panic异常", zap.Reflect("error", err), zap.Reflect("app", appExeName), zap.Reflect("pid", pid), zap.Reflect("strack", string(debug.Stack())), zap.Reflect("LogId", logId), ) notice.NoticeMsg("goHandleConn:引发panic异常", fmt.Sprintf("LogId:%s %v:app:%v:pid:%v:strack:", logId, err, appExeName, pid, string(debug.Stack()))) } return }() // todo 查询数据库 这个地方用到gorm _, err = conn.Write(recBuf) return } ```
#2