Go не убивает процессы GUI даже после установки pid группы процессов - PullRequest
0 голосов
/ 13 апреля 2020

Итак, я хотел запустить процесс и уничтожить его, используя мой код Go. Вот код

package main

import (
    "fmt"
    "os/exec"
    "syscall"
)

func main() {
    cmd := exec.Command("subl")
    cmd.SysProcAttr = &syscall.SysProcAttr{Setpgid: true}
    err := cmd.Start()
    if err != nil {
        fmt.Println(err)
        return
    }
    // wait for the process to complete
    err = cmd.Wait()
    if err != nil {
        fmt.Println(err)
    }

    time.Sleep(3 * time.Second)

    pgid, err := syscall.Getpgid(cmd.Process.Pid)
    if err != nil {
        fmt.Println(cmd, " can't kill ", err)
    }
    syscall.Kill(-pgid, 15)
}

Я установил идентификатор группового процесса после прочтения этого ответа, надеясь, что он будет работать Почему Go не уничтожит дочерний процесс правильно?

Но если я открываю такие процессы, как firefox, или возвышенно, он запускает их, но не может их убить, говоря no such process, но я все равно вижу, что браузер или окно редактора открываются после выхода из моей программы. Как мне правильно убить такие процессы? процессы, которые заканчиваются sh, даже если они работают.

1 Ответ

2 голосов
/ 13 апреля 2020

Ваш код ожидает завершения процессов и затем пытается его убить. Там нет процесса, чтобы убить наверняка? Я ожидаю, что то, что происходит, заключается в том, что браузер или другое приложение порождает новый процесс из себя и затем завершает исходный процесс, когда ваш код возвращается. Браузер все еще работает, но процесс, который его породил, уже мертв.

Это характерно для приложений, которые поддерживают работу только 1 основного процесса - например, если вы запустите 3 процесса браузера, они будут сигнализировать первому открыть новые вкладки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...