gpt4 book ai didi

Golang 无法杀死子进程的父进程

转载 作者:IT王子 更新时间:2023-10-29 02:34:24 26 4
gpt4 key购买 nike

最近几天我有点挣扎于 fork 一个进程并从 fork 的进程中杀死父进程

我不知道为什么,但似乎根本没有杀死 parent 。首先,由于优雅的关闭过程,我很难打开连接来保持进程运行,但这不是那个问题。

如果我从终端向父级发送 SIGTERM 它工作得很好,但是当子级发送 SIGTERM 它不会停止,强制退出不是正常关机的选项。

编辑 * 进程仍在进程列表中。也许那是为了 parent 跟踪它的 child ?

一些 fork 的代码,也许我在这里做错了什么

func (s *Server) Upgrade() error {
tl := s.listener.(*listener)

addr := s.listener.Addr()
name := fmt.Sprintf("%s:%s->", addr.Network(), addr.String())
os.Setenv("PROX_NAME", name)

fl, err := tl.File()
if err != nil {
return fmt.Errorf("Failed to extract file desciptor, %v", err)
}

fd := fl.Fd()

argv0, err := exec.LookPath(os.Args[0])
if err != nil {
return fmt.Errorf("Failed to execute lookpath, %v", err)
}

noCloseOnExec(fd)

files := make([]*os.File, fd+1)
files[syscall.Stdin] = os.Stdin
files[syscall.Stdout] = os.Stdout
files[syscall.Stderr] = os.Stderr

files[fd] = os.NewFile(fd, name)

wd, err := os.Getwd()
if err != nil {
return err
}

os.Setenv("GPROXY_FD", fmt.Sprintf("%d", fd))
os.Setenv("GPROXY_PID", fmt.Sprintf("%d", syscall.Getpid()))
args := []string{"gproxy", "-debug", "start"}
_, err = os.StartProcess(argv0, args, &os.ProcAttr{
Dir: wd,
Env: os.Environ(),
Files: files,
})

return err
}

parent 的终止

func termParentProcess() error {
pid := syscall.Getppid()
return syscall.Kill(pid, syscall.SIGTERM)
}

最佳答案

长话短说,你不能 fork ,它有一个非常古老且持续存在的问题 here .

<罢工>

你可以使用类似 https://github.com/icattlecoder/godaemon 的东西但是 parent 必须终止自己而不是 child 。

var isChild = flag.Bool("child", false, "parent pid")

func main() {
flag.Parse()
var s string
if !*isChild { //parent
fmt.Println("forking")
files := make([]*os.File, 3)
files[syscall.Stdin] = os.Stdin
files[syscall.Stdout] = os.Stdout
files[syscall.Stderr] = os.Stderr
fmt.Println(os.StartProcess(os.Args[0], append(os.Args, "-child"), &os.ProcAttr{
Dir: "/tmp",
Env: os.Environ(),
Files: files,
}))
fmt.Scan(&s) // block
} else {
ppid := os.Getppid()
fmt.Println("ppid", ppid, "kill:", syscall.Kill(ppid, syscall.SIGTERM))
time.Sleep(5 * time.Second)
fmt.Println("child dying")
}
}

关于Golang 无法杀死子进程的父进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25921698/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com