judwhite / go-svc Goto Github PK
View Code? Open in Web Editor NEWGo Windows Service wrapper that plays nice with Linux.
License: MIT License
Go Windows Service wrapper that plays nice with Linux.
License: MIT License
Here's how to catch CTRL_CLOSE_EVENT
in Windows (end task or close console window). There was some effort to translate this to SIGTERM
but requires blocking which isn't compatible with the signal.Notify
model.
The right way to stop a service would be sc stop
or net stop
and I believe these stop signals are sent during reboot/shutdown, I'll have to double check. If they are this is probably just "interesting" and adding this would help in the case of someone killing the process instead of stopping the service gracefully.
If I add an HTTP-Server with a go routine I always get a 1053 timeout if I start the service on Windows.
package main
import (
"log"
"ims/webserver"
"sync"
"github.com/judwhite/go-svc/svc"
)
// program implements svc.Service
type program struct {
wg sync.WaitGroup
quit chan struct{}
}
func main() {
prg := &program{}
// Call svc.Run to start your program/service.
if err := svc.Run(prg); err != nil {
log.Fatal(err)
}
}
func (p *program) Init(env svc.Environment) error {
log.Printf("is win service? %v\n", env.IsWindowsService())
return nil
}
func (p *program) Start() error {
// The Start method must not block, or Windows may assume your service failed
// to start. Launch a Goroutine here to do something interesting/blocking.
go webserver.StartWebserver()
p.quit = make(chan struct{})
p.wg.Add(1)
go func() {
log.Println("Starting...")
<-p.quit
log.Println("Quit signal received...")
p.wg.Done()
}()
return nil
}
func (p *program) Stop() error {
// The Stop method is invoked by stopping the Windows service, or by pressing Ctrl+C on the console.
// This method may block, but it's a good idea to finish quickly or your process may be killed by
// Windows during a shutdown/reboot. As a general rule you shouldn't rely on graceful shutdown.
log.Println("Stopping...")
close(p.quit)
p.wg.Wait()
log.Println("Stopped.")
return nil
}
it is a nice package ! it would be better if it is available as go module。
why not add a go.mod under its root directory.
When I'm using version 1.2.1 of the library, the service fails to start when using gMSA.
It works perfectly with local system accounts and local users.
I downgraded the module to version 1.0.0, and now it works as expected (at least the service starts).
Can I somehow get the name of the service my progam run under?
for example in Init()?
env var?
I've written a client for win/lin/mac that can run interactively, or as a service, or as a scheduled task.
Whilst using go-svc handles a graceful stop when a SIGINT or windows service stop is received, I want to also be able to call prg.Stop() to stop programatically eg after a set number of interactions/time etc.
For some calling prg.Stop() (as per your example/main.go) just hangs.
I've also tried sending a SIGINT to self: This works on mac/lin causing the Stop() func to run, but on windows it exits immediately without calling Stop()
How do you stop go-svc programatically (at the moment I'm just doing os.exit() but that seems crude).
If the binary isn't running under Service Control Manager (SCM), then StartServiceCtrlDispatcher()
will fail with ERROR_FAILED_SERVICE_CONTROLLER_CONNECT
. This is a more reliable way of detecting if a service is running under SCM than checking svc.IsAnInteractiveSession
. Checking the IsAnInteractiveSession
value first can be an optimization to avoid skipping the StartServiceCtrlDispatcher
error check.
In Go, svc.Run
should fail here calling windows.StartServiceCtrlDispatcher
.
Troubleshooting tips, if needed: http://stackoverflow.com/a/30719534 (from 2015-05-26)
go-svc has been working great for me. However, after upgrading from Go 1.14.1 to 1.15.0 my Windows 10 service no longer works! When I attempt to start the service, Windows gives this error:
Error 1067: The process terminated unexpectedly
The Go 1.15 release notes talk about significant changes to the Linker, perhaps that's the problem? The issue is easy to reproduce using the Example program from the go-svc readme. Windows 10 Professional, build 1903.
I notice that lines 67-69 in https://github.com/judwhite/go-svc/blob/master/example/main.go:
if err := p.svr.stop(); err != nil {
return err
}
make a point of calling stop, whereas the example Stop function in the readme does not .
Could you please clarify if calling p.svr.stop is necessary?
OS windows 10 corp
Hi. When the screen is locked (hotkey win + L), the service stops, when logging in, the service starts again. If I understood the code correctly, then the information about the status change comes from the library golang.org/x/sys/windows/svc
, is it possible to do something about it, or does it not depend on the implementation of the current library, so it works golang.org/x/sys/windows/svc ? And in general, how normal is this behavior for services?
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.