Quero sair do processo de destino graciosamente em vez de encerrá-lo diretamente. O processo A envia um comando para o processo B e, após recebê-lo, B completará suas tarefas de limpeza e então sairá.
- O processo de destino não é um programa de console, então não posso usar
windows.GenerateConsoleCtrlEvent
. - O processo de destino não é uma interface gráfica, então não posso usar
WM_CLOSE
.
O Kill
método no os
pacote Golang na verdade usa TerminateProcess
, o que não é o que eu quero.
Atualizar:
- Tentei fazer o processo alvo escutar stdin. O subprocesso começou e então terminou imediatamente. Parece que isso não funciona no modo não interativo.
if runtime.GOOS == "windows" { reader := bufio.NewReader(os.Stdin) if _, err := reader.ReadString('\n'); err != nil { stop() } }
- Eu tentei usar
taskkill /t
, mas ele me disse que o processo alvo é um processo filho de outro processo. Então eu ajustei o relacionamento pai-filho e fiz o processo pai chamartaskkill /t
, mas ele ainda retornou o erroExit status 128
. Isso é muito estranho.
Finalmente:
No final, resolvi o problema usando pipes nomeados. A desvantagem é que ele requer suporte no código do processo de destino. Mas isso é suficiente para mim porque o processo de destino não é de terceiros.