Я пытаюсь написать 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% убивает эти процессы