go程序报错Unix syslog delivery error

go程序报错Unix syslog delivery error



为什么截一张这样的代码图片,是因为程序报错Unix syslog delivery error

起初报这个错误,我也是一脸懵逼,通过Google搜索,找到这段代码

代码意思是:通过网络连接,只要连接成功,就返回

遍历连接方式unixgram,unix

遍历连接目标 /dev/log /var/run/syslog /var/run/log

所有的遍历都尝试后,不成功的,返回错误信息

那么什么是unixgram unix, unixpacket又是什么呢

socket套接字

基于网络:AF_INET

基于文件: AF_UNIX

Unix套接字,作用于本地进程之间的通信(Unix domain socket) uds 进程之间通信,不需要网络协议栈,

服务端代码例子 s.go

package main
import (
 "fmt"
 "net"
 "os"
)
func main() {
 os.Remove("/tmp/ee")
 addr := &net.UnixAddr{Name: "/tmp/ee", Net: "unix"}
 unixlisten, err := net.ListenUnix("unix", addr)
 if err != nil {
    panic(err)
 }
 defer unixlisten.Close()
 for {
    unixconn, err := unixlisten.AcceptUnix()
    if err != nil {
   continue
    }
    go unixWork(unixconn)
 }
}
func unixWork(conn *net.UnixConn) {
 ipstr := conn.RemoteAddr()
 defer conn.Close()
 fmt.Println(ipstr)
 var buf [1024]byte
 n, err := conn.Read(buf[:])
 if err != nil {
    panic(err)
 }
 fmt.Printf("%s\n", string(buf[:n]))
 conn.Write([]byte("hello,world"))
}


运行后,会产生一个socket类型文件,客户端进程与服务端进程将通过这个文件进行数据交互

go程序报错Unix syslog delivery error


客户端代码 c.go

package main
import (
 "fmt"
 "net"
)
func main() {
 unixaddr := &net.UnixAddr{Net: "unix", Name: "/tmp/ee"}
 conn, err := net.DialUnix("unix", nil, unixaddr)
 if err != nil {
    panic(err)
 }
 defer conn.Close()
 conn.Write([]byte("hello,s"))
 var b [1024]byte
 n, err := conn.Read(b[:])
 if err != nil {
    fmt.Println(err)
 }
 fmt.Println(string(b[:n]))
}

通过lsof 可以查看到/tmp/ee 被那个进程使用

go程序报错Unix syslog delivery error


这下我们大概了解了啥情况,通信使用的,不过没有进入网络层

再来看看三者是啥区别

unix SOCK_STREAM tcp

unixgram SOCK_DGRAM udp

unixpacket SOCK_SEQPACKET 这个还没搞清楚

go程序报错Unix syslog delivery error


再回到开始的话题,当你看到这个错误syslog delivery error

你可能就秒懂,是因为通过基于文件的套接字连接不上

/dev/log /var/run/syslog /var/run/log 这几个文件没有对应的程序去监听它们

我开始也不知道是那些程序会监听这几个文件,不过大概猜测是与日志有关

Linux的日志服务,有syslog,rsyslog,journalctl,索性重启电脑,再通过lsof查看下

go程序报错Unix syslog delivery error


如果我把这个服务停止掉,go应用程序某个功能就会出错,报syslog delivery error

go程序报错Unix syslog delivery error

上一篇:我对lot的理解


下一篇:测试人员学习云原生