Невозможно завершить процессы, которые я начал использовать с кодом Go - PullRequest
0 голосов
/ 12 апреля 2020

Я пытаюсь написать go пакет, который может запустить кучу процессов и остановить / перезапустить их. Это часть остановки / перезапуска, которая вызывает проблему для некоторых приложений.

Я использую библиотеку https://godoc.org/os/exec для запуска процессов. Допустим, я запускаю два процесса firefox, и другой процесс может curl blog.golang.org, который будет продолжать работать.

Вот как я запускаю процессы и как их остановить

func newWorker(proc *Process) *worker {
    cmd := exec.Command(proc.Executable, proc.Args...)
    cmd.Env = proc.Env
    return &worker{
        status:  "ready",
        command: cmd,
    }
}

func (w *worker) start(crashed chan *worker, completed chan struct{}) {
    w.status = "running"
    err := w.command.Start()
    if err != nil {
        fmt.Println(err)
        // signal a crash
        w.status = "crashed"
        crashed <- w
        return
    }
    fmt.Println("ran ", w.command.Path, w.command.Process.Pid)
    completed <- struct{}{}
}

func (w *worker) stop(crashed chan *worker, completed chan struct{}) {
    w.status = "stopped"
    err := w.command.Process.Kill()
    if err != nil {
        fmt.Println("couldn't kill process ", w.command.Path)
    }
    completed <- struct{}{}
}

Когда я запускаю мое приложение, чтобы запустить этот процесс, запускает как команду curl, так и firefox, но когда я пытаюсь вызвать метод stop, это убивает процессы без каких-либо ошибок, но я все еще вижу окно firefox открытым, поэтому я не уверен, если процесс завершился или нет. Я попытался убить процессы с обоими Kill и Signal(os.Kill), которые имели одинаковый результат.

Я также попытался изменить способ создания процессов, используя Run вместо Start, но в в этом случае при вызове метода stop я получил эти ошибки

os: process already finished  couldn't kill process  /usr/bin/curl
exit status 0  KILLING  /usr/bin/curl
os: process already finished  couldn't kill process  /usr/bin/firefox

, и окно firefox все еще было открыто, я также попытался распечатать поле ProcessState для каждой команды, которую я выполнял, но это оказалось nil

Я не уверен, что делать, я хочу убедиться, что мой код на 100% убивает эти процессы

1 Ответ

0 голосов
/ 12 апреля 2020

Если вы прочитали do c для func (*Process) Kill

func (p *Process) Kill() error

Kill вызывает немедленное завершение процесса. Kill не ждет, пока процесс не завершится. Это убивает только сам процесс, а не любые другие процессы, которые он мог запустить.

Таким образом, это может быть ваш случай, что он не убивает другие процессы, которые он мог запустить.

Также это может помочь : Завершение процессов в go

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