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.
Quando não tiver certeza, recomendo olhar para aplicativos de código aberto bem conhecidos que tenham a funcionalidade que você deseja fazer. Como exemplo, o Air é um conhecido gerador de processos que monitora alterações de arquivo e reinicia aplicativos em caso de alteração. Eles implementam o processo start and kill assim:
Você pode encontrar o repositório aqui
Eles também fazem referência a outra postagem do Stack Overflow sobre o motivo pelo qual usam esse método específico.
No final, resolvi o problema usando pipes nomeados.