|
@@ -10,7 +10,6 @@ import (
|
|
"os/exec"
|
|
"os/exec"
|
|
"path/filepath"
|
|
"path/filepath"
|
|
"time"
|
|
"time"
|
|
- "unsafe"
|
|
|
|
|
|
|
|
"github.com/sirupsen/logrus"
|
|
"github.com/sirupsen/logrus"
|
|
"github.com/spf13/pflag"
|
|
"github.com/spf13/pflag"
|
|
@@ -187,35 +186,14 @@ func registerService() error {
|
|
}
|
|
}
|
|
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
|
|
|
|
|
|
+ err = s.SetRecoveryActions(
|
|
|
|
+ []mgr.RecoveryAction{
|
|
|
|
+ {Type: mgr.ServiceRestart, Delay: 15 * time.Second},
|
|
|
|
+ {Type: mgr.ServiceRestart, Delay: 15 * time.Second},
|
|
|
|
+ {Type: mgr.NoAction},
|
|
|
|
+ },
|
|
|
|
+ uint32(24*time.Hour/time.Second),
|
|
)
|
|
)
|
|
-
|
|
|
|
- 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 {
|
|
if err != nil {
|
|
return err
|
|
return err
|
|
}
|
|
}
|