mirror of
https://github.com/moby/moby.git
synced 2022-11-09 12:21:53 -05:00
Merge pull request #27700 from Microsoft/jjh/servicerestart
Windows: Set service recovery options
This commit is contained in:
commit
f81c538fec
1 changed files with 36 additions and 0 deletions
|
@ -9,6 +9,8 @@ import (
|
||||||
"os/exec"
|
"os/exec"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"syscall"
|
"syscall"
|
||||||
|
"time"
|
||||||
|
"unsafe"
|
||||||
|
|
||||||
"github.com/Sirupsen/logrus"
|
"github.com/Sirupsen/logrus"
|
||||||
"github.com/spf13/pflag"
|
"github.com/spf13/pflag"
|
||||||
|
@ -183,6 +185,40 @@ func registerService() error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
defer s.Close()
|
defer s.Close()
|
||||||
|
|
||||||
|
// See http://stackoverflow.com/questions/35151052/how-do-i-configure-failure-actions-of-a-windows-service-written-in-go
|
||||||
|
const (
|
||||||
|
scActionNone = 0
|
||||||
|
scActionRestart = 1
|
||||||
|
scActionReboot = 2
|
||||||
|
scActionRunCommand = 3
|
||||||
|
|
||||||
|
serviceConfigFailureActions = 2
|
||||||
|
)
|
||||||
|
|
||||||
|
type serviceFailureActions struct {
|
||||||
|
ResetPeriod uint32
|
||||||
|
RebootMsg *uint16
|
||||||
|
Command *uint16
|
||||||
|
ActionsCount uint32
|
||||||
|
Actions uintptr
|
||||||
|
}
|
||||||
|
|
||||||
|
type scAction struct {
|
||||||
|
Type uint32
|
||||||
|
Delay uint32
|
||||||
|
}
|
||||||
|
t := []scAction{
|
||||||
|
{Type: scActionRestart, Delay: uint32(60 * time.Second / time.Millisecond)},
|
||||||
|
{Type: scActionRestart, Delay: uint32(60 * time.Second / time.Millisecond)},
|
||||||
|
{Type: scActionNone},
|
||||||
|
}
|
||||||
|
lpInfo := serviceFailureActions{ResetPeriod: uint32(24 * time.Hour / time.Second), ActionsCount: uint32(3), Actions: uintptr(unsafe.Pointer(&t[0]))}
|
||||||
|
err = windows.ChangeServiceConfig2(s.Handle, serviceConfigFailureActions, (*byte)(unsafe.Pointer(&lpInfo)))
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
err = eventlog.Install(*flServiceName, p, false, eventlog.Info|eventlog.Warning|eventlog.Error)
|
err = eventlog.Install(*flServiceName, p, false, eventlog.Info|eventlog.Warning|eventlog.Error)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
|
|
Loading…
Reference in a new issue