Windows优雅关闭
## 尝试优雅关闭
## -WindowStyle必须不是Hidden, 比如Minimized
$proc.CloseMainWindow() | Out-Null
## 事件(轻量,如果不用数据,可以用这个)
$eventName = "shutdown_pid_$($proc.Id)"
$event = [System.Threading.EventWaitHandle]::OpenExisting($eventName)
$event.Set()
$event.Close()
## named pipe
$pipe = New-Object System.IO.Pipes.NamedPipeClientStream(".", $eventName, [System.IO.Pipes.PipeDirection]::Out)
$pipe.Connect(1000)
$pipe.Close()
func waitShutdownPipe(pid int) {
// github.com/Microsoft/go-winio
ln, _ := winio.ListenPipe(fmt.Sprintf("\\\\.\\pipe\\shutdown_pid_%d", pid), nil)
defer ln.Close()
conn, _ := ln.Accept()
defer conn.Close()
fmt.Printf("shutdown pipe received\n")
}
func waitShutdownEvent(pid int) {
// golang.org/x/sys/windows
name, _ := windows.UTF16PtrFromString(fmt.Sprintf("shutdown_pid_%d", pid))
event, _ := windows.CreateEvent(nil, 0, 0, name)
defer windows.CloseHandle(event)
windows.WaitForSingleObject(event, windows.INFINITE)
//sc <- syscall.SIGTERM
fmt.Printf("shutdown event received\n")
}