golang windows服务程序
时间: 2024-03-05 22:45:23 浏览: 115
Go语言提供了一个内置的包`net/http`,可以用来创建HTTP服务器。在Windows上,可以将这个HTTP服务器作为一个Windows服务运行。
下面是一个简单的示例代码,演示如何使用Go语言创建一个Windows服务程序:
```go
package main
import (
"fmt"
"log"
"net/http"
"os"
"os/signal"
"syscall"
"time"
"golang.org/x/sys/windows/svc"
"golang.org/x/sys/windows/svc/debug"
)
type myService struct{}
func (m *myService) Execute(args []string, r <-chan svc.ChangeRequest, changes chan<- svc.Status) (ssec bool, errno uint32) {
const cmdsAccepted = svc.AcceptStop | svc.AcceptShutdown
changes <- svc.Status{State: svc.StartPending}
go func() {
// 启动HTTP服务器
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Hello, World!")
})
err := http.ListenAndServe(":8080", nil)
if err != nil {
log.Fatal(err)
}
}()
changes <- svc.Status{State: svc.Running, Accepts: cmdsAccepted}
loop:
for {
select {
case c := <-r:
switch c.Cmd {
case svc.Interrogate:
changes <- c.CurrentStatus
time.Sleep(100 * time.Millisecond)
changes <- c.CurrentStatus
case svc.Stop, svc.Shutdown:
break loop
default:
log.Printf("unexpected control request #%d", c)
}
}
}
changes <- svc.Status{State: svc.StopPending}
return
}
func main() {
isIntSess, err := svc.IsAnInteractiveSession()
if err != nil {
log.Fatal(err)
}
if isIntSess {
runService()
return
}
debug.Run("MyService", &myService{})
}
func runService() {
err := svc.Run("MyService", &myService{})
if err != nil {
log.Fatal(err)
}
}
```
这个示例代码创建了一个简单的HTTP服务器,监听在本地的8080端口。当将这个程序安装为Windows服务后,可以通过访问`http://localhost:8080`来访问该服务。
要将这个程序安装为Windows服务,可以使用`sc`命令或者使用第三方工具如`nssm`。下面是使用`sc`命令的示例:
1. 打开命令提示符,以管理员身份运行。
2. 进入程序所在的目录。
3. 执行以下命令安装服务:`sc create MyService binPath= "<程序路径>" start= auto`
4. 执行以下命令启动服务:`sc start MyService`
现在,你可以通过访问`http://localhost:8080`来测试这个服务。
阅读全文