我正在写一份我正在写的服务。我把它记录到syslog中,如下所示:http://technosophos.com/2013/09/14/using-gos-built-logger-log-syslog.html
但是当我通过CTRL-C终止服务时,某些东西会让连接打开到syslogd。无论如何我都无法开始清理。我缺少什么
e.g。我syslog.Writer.Close()
似乎无法访问,但我可以说清理工作没有发生。我看到连接卡在CLOSE_WAIT状态,我的syslogd开始陷入停顿并变得不合作。
示例:
package main
import (
"github.com/davecgh/go-spew/spew" // DEBUG
"log"
"log/syslog"
"os"
"os/signal"
"syscall"
)
func main() {
logWriter, err := syslog.New(syslog.LOG_NOTICE, "mybrokenprog")
spew.Dump(logWriter) // DEBUG
spew.Dump(err) // DEBUG
if err == nil {
log.SetOutput(logWriter)
}
chansigs := make(chan os.Signal, 1)
signal.Notify(chansigs, os.Interrupt, syscall.SIGTERM, syscall.SIGKILL)
log.Print("writing to syslog. waiting for shutdown signal")
for {
sig := <-chansigs // we just wait here for a signal to shutdown
log.Print("signal received...shutting down")
logWriter.Close() // but this throws the panic excerpted below
if sig == os.Interrupt {
os.Exit(0)
}
os.Exit(1)
}
}
编辑:上面的代码解决了这个问题。看到评论。重新启动以清除与syslog的卡住连接修复了问题。一旦他们在那里,他们就会坚持不懈。甚至OS X关于重新启动syslogd的指令也无济于事。 编辑:这是错误:恐慌:运行时错误:无效的内存地址或无指针取消引用 [signal 0xb code = 0x1 addr = 0x0 pc = 0xcb4fe]
goroutine 1 [正在运行]: log / syslog。(* Writer).Close(0x0,0x0,0x0) /usr/local/Cellar/go/1.5.1/libexec/src/log/syslog/syslog.go:177 + 0x10e main.main段(0x3)
毫无疑问,我做错了。只是一个还没有看到位置的新手。
答案 0 :(得分:0)
问题在于程序最初的结构方式。 main()线程在记录goroutine之前退出,因此是孤立的连接。经过重构以防止这种情况发生后,问题就消失了。