systemd 守护的一个使用golang 实现的tcp服务,
这个服务使用了github.com/jinzhu/gorm ,每隔一小时 服务就会被重启一次,毫无头绪,无从下手,哪位大神可指点指点,怎么排查
问题已解决,感谢楼上的各位的热心帮助,下面是我得解决方法,确定问题就在于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