詳解go程序如何在windows服務(wù)中開啟和關(guān)閉
本篇主要是講述一個(gè)go程序,如何在windows服務(wù)中優(yōu)雅開啟和關(guān)閉,廢話不多說,開搞?。?!
使用方式:go程序 + net服務(wù)啟動(dòng)
Ⅰ 開篇不利
Windows go進(jìn)程編譯后,為一個(gè).exe文件,直接執(zhí)行即可運(yùn)行
net start tamper_proof_refactored
啟動(dòng)后,發(fā)現(xiàn)windows服務(wù)根本不認(rèn)識這個(gè)go二進(jìn)制文件,完全起不來
注意:因?yàn)槠胀ǖ某绦驘o法處理Windows服務(wù)特有的消息,普通的Go程序也無法在服務(wù)模式運(yùn)行。
Ⅱ 需求拆解
現(xiàn)在知道一個(gè)問題了:普通的go程序啟動(dòng)服務(wù)后,服務(wù)會出現(xiàn)"無響應(yīng)控制功能"
現(xiàn)在是想要實(shí)現(xiàn)什么?
go程序編譯的二進(jìn)制文件,可以被當(dāng)作windows服務(wù),穩(wěn)定在后臺執(zhí)行,并可優(yōu)雅開啟和關(guān)閉
Ⅲ 具體實(shí)現(xiàn)
找到一個(gè)go的官方庫,用于實(shí)現(xiàn)windows服務(wù)注冊和啟動(dòng)的
golang.org/x/sys/windows/svc
具體實(shí)現(xiàn)邏輯如下
func (m *myService) Execute(args []string, r <-chan svc.ChangeRequest, changes chan<- svc.Status) (ssec bool, errno uint32) { const cmdsAccepted = svc.AcceptStop | svc.AcceptShutdown | svc.AcceptPauseAndContinue changes <- svc.Status{State: svc.StartPending} go Star() // 啟動(dòng)go程序的主程序【需要有一個(gè)主入口函數(shù)】 changes <- svc.Status{State: svc.Running, Accepts: cmdsAccepted} loop: for { c := <-r switch c.Cmd { case svc.Interrogate: changes <- c.CurrentStatus case svc.Stop, svc.Shutdown: Exit() // 停止你的程序 break loop case svc.Pause: // 添加你的程序的暫停邏輯 changes <- svc.Status{State: svc.Paused, Accepts: cmdsAccepted} case svc.Continue: // 添加你的程序的繼續(xù)邏輯 changes <- svc.Status{State: svc.Running, Accepts: cmdsAccepted} default: log.Printf("unexpected control request #%d", c) } } changes <- svc.Status{State: svc.StopPending} return } func RunService() { err := svc.Run("tamper_proof_refactored", &myService{}) if err != nil { log.Fatal(err) } fmt.Println("服務(wù)已啟動(dòng)") }
啟動(dòng)后,直接終端查看下效果
寫了一個(gè)服務(wù)狀態(tài)判斷,打印出的服務(wù)當(dāng)前狀態(tài)日志
寫完后,就可以正常的服務(wù)啟動(dòng)和關(guān)閉了,下面是詳細(xì)的服務(wù)啟動(dòng)/關(guān)閉指令
sc create MyService binPath= "C:\path\to\your\program\tamper_proof_XXXX.exe" //創(chuàng)建服務(wù) net start MyService // 開啟服務(wù) net stop myserver // 暫停服務(wù) sc delete myserver // 刪除服務(wù)
到此這篇關(guān)于詳解go程序如何在windows服務(wù)中開啟和關(guān)閉的文章就介紹到這了,更多相關(guān)go windows服務(wù)開啟和關(guān)閉內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
golang使用viper加載配置文件實(shí)現(xiàn)自動(dòng)反序列化到結(jié)構(gòu)
這篇文章主要為大家介紹了golang使用viper加載配置文件實(shí)現(xiàn)自動(dòng)反序列化到結(jié)構(gòu)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-08-08go語言中切片與內(nèi)存復(fù)制 memcpy 的實(shí)現(xiàn)操作
這篇文章主要介紹了go語言中切片與內(nèi)存復(fù)制 memcpy 的實(shí)現(xiàn)操作,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-04-04Go?Ginrest實(shí)現(xiàn)一個(gè)RESTful接口
這篇文章主要為大家介紹了Go?Ginrest實(shí)現(xiàn)一個(gè)RESTful接口示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-08-08淺析Go語言如何避免數(shù)據(jù)競爭Data?Race和競態(tài)條件Race?Condition
在并發(fā)編程中,數(shù)據(jù)競爭?(Data?Race)?和?競態(tài)條件?(Race?Condition)?是兩個(gè)常見的問題,本文將簡單介紹一下二者如何避免,有需要的可以了解下2025-01-01go的defer和閉包示例說明(非內(nèi)部實(shí)現(xiàn))
這篇文章主要為大家介紹了go的defer和閉包示例說明(非內(nèi)部實(shí)現(xiàn)),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-08-08