1 回答
TA贡献1873条经验 获得超9个赞
经过这里的一些指导,加上阅读现有 Go Windows 服务接口的源代码,我想出了我自己的答案,我将尝试在下面记录。
有关使用 Windows DLL 时的类型参考,MSDN 文档在此处。
我的代码如下所示:
import (
"unsafe"
"golang.org/x/sys/windows"
)
const (
SC_ACTION_NONE = 0
SC_ACTION_RESTART = 1
SC_ACTION_REBOOT = 2
SC_ACTION_RUN_COMMAND = 3
SERVICE_CONFIG_FAILURE_ACTIONS = 2
)
type SERVICE_FAILURE_ACTIONS struct {
ResetPeriod uint32
RebootMsg *uint16
Command *uint16
ActionsCount uint32
Actions uintptr
}
type SC_ACTION struct {
Type uint32
Delay uint32
}
func setServiceFailureActions(handle windows.Handle) error {
t := []SC_ACTION{
{ Type: SC_ACTION_RESTART, Delay: uint32(1000) },
{ Type: SC_ACTION_RESTART, Delay: uint32(10000) },
{ Type: SC_ACTION_RESTART, Delay: uint32(60000) },
}
m := SERVICE_FAILURE_ACTIONS{ ResetPeriod: uint32(60), ActionsCount: uint32(3), Actions: uintptr(unsafe.Pointer(&t[0])) }
return windows.ChangeServiceConfig2(handle, SERVICE_CONFIG_FAILURE_ACTIONS, (*byte)(unsafe.Pointer(&m)))
}
在我的基本示例中,您需要传递一个服务句柄,然后它将失败操作设置为硬编码的默认值:
1 秒后第一次重启。
10 秒后重新启动第二次。
第三次以及 60 秒后的任何后续次数重新启动。
60 秒后重置故障计数器。
我刚刚测试过,它似乎工作正常。
- 1 回答
- 0 关注
- 322 浏览
添加回答
举报