這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
程式很簡單,通過簡單的http請求來守護伺服器背景程式
package mainimport ("fmt""net""net/http""strings""time")var (info []net.Addrip stringgeturl stringrequest *http.Requestresp *http.Responseclient *http.Clientipx string)func main() {info, _ = net.InterfaceAddrs()ip = strings.Split(info[0].String(), "/")[0]fmt.Println(ip)fmt.Println("alarm will begin in 30 second..")fmt.Println("please DO NOT close..")i := 10for i > 0 {time.Sleep(time.Second * 1)fmt.Println(i)i--}geturl = "http://" + ip + "/alarmbegin"request, _ = http.NewRequest("GET", geturl, nil)///not mustclient = &http.Client{}resp, _ = client.Do(request)fmt.Println(resp)fmt.Println("done")go Iva()Ivs()}func IvsOffLine() {//ivs斷線處理info, _ = net.InterfaceAddrs()ipx = strings.Split(info[0].String(), "/")[0]//fmt.Println(ipx)if ipx == "0.0.0.0" {fmt.Println("network problem....")fmt.Println(strings.Split(info[0].String(), "/")[0])for strings.Split(info[0].String(), "/")[0] == "0.0.0.0" {time.Sleep(time.Second * 5)info, _ = net.InterfaceAddrs()}fmt.Println("network problem fixed.. alarm will restart in 1 min")time.Sleep(time.Second * 30)geturl = "http://" + strings.Split(info[0].String(), "/")[0] + "/refresh"request, _ = http.NewRequest("GET", geturl, nil)resp, _ = client.Do(request)fmt.Println(resp)time.Sleep(time.Second * 2)fmt.Println("alarm begin..")geturl = "http://" + strings.Split(info[0].String(), "/")[0] + "/alarmbegin"request, _ = http.NewRequest("GET", geturl, nil)resp, _ = client.Do(request)fmt.Println(resp)fmt.Println("done..")}}//iva 斷線處理func IvaOffLine() {defer func() { //必須要先聲明defer,否則不能捕獲到panic異常if err := recover(); err != nil {fmt.Println(err) //panic}}()geturl = "http://192.168.10.57/milsng/SVSProxy/"request, _ = http.NewRequest("GET", geturl, nil)resp, _ = client.Do(request)if resp == nil {fmt.Println("iva connect fail...try to reconnect")for resp == nil {time.Sleep(time.Second * 5)geturl = "http://192.168.10.57/milsng/SVSProxy/"request, _ = http.NewRequest("GET", geturl, nil)resp, _ = client.Do(request)fmt.Println("iva connect fail...try to reconnect")}fmt.Println("iva connect refreshing... pls wait")info, _ = net.InterfaceAddrs()if strings.Split(info[0].String(), "/")[0] != "0.0.0.0" {time.Sleep(time.Minute * 10) //等待10分鐘,目的是等待iva伺服器恢複geturl = "http://" + strings.Split(info[0].String(), "/")[0] + "/refresh"request, _ = http.NewRequest("GET", geturl, nil)resp, _ = client.Do(request)fmt.Println(resp)time.Sleep(time.Second * 2)fmt.Println("alarm begin..")geturl = "http://" + strings.Split(info[0].String(), "/")[0] + "/alarmbegin"request, _ := http.NewRequest("GET", geturl, nil)resp, _ = client.Do(request)fmt.Println(resp)}}//fmt.Println("iva connect success")}func Ivs() {ivs := time.NewTicker(10 * time.Second)for {select {case <-ivs.C:IvsOffLine()}}}func Iva() {iva := time.NewTicker(10 * time.Second)for {select {case <-iva.C:IvaOffLine()}}}
首先 在代碼中加入了runtime.GC, 回收垃圾, 結果無效,看來並不是未釋放的記憶體
然後嘗試了debug.freeosmemory 從來釋放堆記憶體給系統 ,還是在不斷變大!!!
後來發現是 TCP串連,
在代碼中加入
if resp != nil {resp.Body.Close()}
關閉 io , 遂解決
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。