我正在Go中编写一个程序,它应该打开一个可移植的浏览器到一个给定的页面并监视它,这样如果浏览器关闭,它应该自动重新打开.程序退出时也应该关闭浏览器.
到目前为止,我已经设法在用户关闭浏览器时重新打开浏览器,但是我无法关闭它.
这是我的代码:
package browser
import (
"fmt"
"os/exec"
log "github.com/sirupsen/logrus"
)
type iBrowserHandler interface {
Start(processListener chan bool) error
Stop() error
KillProcess() error
}
type browserHandler struct {
cmd *exec.Cmd
pathToChromium string
pdvEndpoint string
}
func newBrowserHandler(pathToChromium string, pdvEndpoint string) iBrowserHandler {
b := &browserHandler{}
b.pathToChromium = pathToChromium
b.pdvEndpoint = pdvEndpoint
return b
}
func (b *browserHandler) Start(processListener chan bool) error {
endpoint := fmt.Sprintf("--app=%s", b.pdvEndpoint)
b.cmd = exec.Command(b.pathToChromium, endpoint, "--kiosk")
err := b.cmd.Run()
if err != nil { …Run Code Online (Sandbox Code Playgroud) 杀死父进程而不是父进程的最佳方法是什么?假设我有一个不确定数量的子进程,我已经分叉并在给定的警报中,在我的信号处理程序中,我想杀死我所有的子进程,但由于各种原因让自己继续运行。
截至目前,我正在使用 kill(-1*parentPid, SIGKILL) 但这会杀死我的父母及其孩子。
我正在尝试停止启动进程exec.Command("go", "run", "server.go")及其所有子进程.
但是当我调用cmd.Process.Kill()并且go进程停止时,子进程(Web服务器server.go)继续运行.
package main
import (
"fmt"
"os/exec"
"time"
)
func run() *exec.Cmd {
cmd := exec.Command("go", "run", "server.go")
err := cmd.Start()
if err != nil {
panic(err)
}
return cmd
}
func main() {
cmd := run()
time.Sleep(time.Second * 2)
err := cmd.Process.Kill()
if err != nil {
panic(err)
}
cmd.Process.Wait()
// === Web server is still running! ===
fmt.Scanln()
}
Run Code Online (Sandbox Code Playgroud)
它看起来Process.Kill()只会停止go (run)进程,但会使其子进程(Web服务器)运行.
^C杀死整个过程组,包括所有子(和子子)过程.我怎么能这样做? …