代码类似于
go func() {
//开启 websocket 监听
http.HandleFunc("/", s.handler)
err := http.ListenAndServe("0.0.0.0:9999", nil)
if err != nil {
logger.Log.Fatal(fmt.Sprintf("err=%v", err))
}
}()
但是有时候启动会报错,显示err=listen tcp 0.0.0.0:9999: bind: address already in use
然而我使用netstat -tuln |grep 9999时,却显示这个端口没被占用
于是我写一个脚本
#!/bin/bash
while true; do
netstat -tuln |grep 9999
sleep 0.1
done
一直开着,再写一个守护脚本当 go 进程结束时自动重启
然后我发现 go 进程因为端口占用问题已经重启了几十次,但是端口扫描的脚本却一次显示端口被占用的情况都没有
但是当我过几个小时再次重启 go 进程时,端口占用问题又消失了
这到底是怎么一回事,而且这情况不是必现的,是偶尔会出现