詳解go程序如何在windows服務中開啟和關閉
本篇主要是講述一個go程序,如何在windows服務中優(yōu)雅開啟和關閉,廢話不多說,開搞!?。?br />使用方式:go程序 + net服務啟動
Ⅰ 開篇不利
Windows go進程編譯后,為一個.exe文件,直接執(zhí)行即可運行
net start tamper_proof_refactored
啟動后,發(fā)現(xiàn)windows服務根本不認識這個go二進制文件,完全起不來

注意:因為普通的程序無法處理Windows服務特有的消息,普通的Go程序也無法在服務模式運行。
Ⅱ 需求拆解
現(xiàn)在知道一個問題了:普通的go程序啟動服務后,服務會出現(xiàn)"無響應控制功能"
現(xiàn)在是想要實現(xiàn)什么?
go程序編譯的二進制文件,可以被當作windows服務,穩(wěn)定在后臺執(zhí)行,并可優(yōu)雅開啟和關閉
Ⅲ 具體實現(xiàn)
找到一個go的官方庫,用于實現(xiàn)windows服務注冊和啟動的
golang.org/x/sys/windows/svc
具體實現(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() // 啟動go程序的主程序【需要有一個主入口函數(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("服務已啟動")
}
啟動后,直接終端查看下效果

寫了一個服務狀態(tài)判斷,打印出的服務當前狀態(tài)日志

寫完后,就可以正常的服務啟動和關閉了,下面是詳細的服務啟動/關閉指令
sc create MyService binPath= "C:\path\to\your\program\tamper_proof_XXXX.exe" //創(chuàng)建服務 net start MyService // 開啟服務 net stop myserver // 暫停服務 sc delete myserver // 刪除服務
到此這篇關于詳解go程序如何在windows服務中開啟和關閉的文章就介紹到這了,更多相關go windows服務開啟和關閉內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
golang使用viper加載配置文件實現(xiàn)自動反序列化到結構
這篇文章主要為大家介紹了golang使用viper加載配置文件實現(xiàn)自動反序列化到結構示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-08-08
go語言中切片與內存復制 memcpy 的實現(xiàn)操作
這篇文章主要介紹了go語言中切片與內存復制 memcpy 的實現(xiàn)操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-04-04
淺析Go語言如何避免數(shù)據(jù)競爭Data?Race和競態(tài)條件Race?Condition
在并發(fā)編程中,數(shù)據(jù)競爭?(Data?Race)?和?競態(tài)條件?(Race?Condition)?是兩個常見的問題,本文將簡單介紹一下二者如何避免,有需要的可以了解下2025-01-01

