Golang 中防止 Ctrl C 中断 exec.Command
使用 exec.Command 执行外部进程时,可能会遇到以下问题:即使您拦截了中断信号,进程也会被 Ctrl C 中断。
出现此行为是因为当按下 Ctrl C 时,shell 向整个进程组发出信号。父进程收到信号并将其转发给所有子进程,导致子进程被中断。
为了防止这种情况,可以使用 syscall.SysProcAttr 在自己的进程组中启动命令。通过将 Setpgid 字段设置为 true,您可以为该命令创建一个新的进程组,并将其与父进程分开。
以下是如何使用 syscall.SysProcAttr 修改示例:
package main import ( "log" "os" "os/exec" "os/signal" "syscall" ) func sleep() { log.Println("Sleep start") cmd := exec.Command("sleep", "60") cmd.SysProcAttr = &syscall.SysProcAttr{ Setpgid: true, } cmd.Run() log.Println("Sleep stop") } func main() { var doneChannel = make(chan bool) go sleep() c := make(chan os.Signal, 1) signal.Notify(c, os.Interrupt) signal.Notify(c, syscall.SIGTERM) go func() { <-c log.Println("Receved Ctrl + C") }() <-doneChannel }
现在,当你在执行过程中按下Ctrl C时,只有主程序会收到信号。 sleep 命令将继续运行,直到 60 秒完成。这可确保该过程不会意外中断。
以上是如何防止 Ctrl C 中断 Go 中的 exec.Command?的详细内容。更多信息请关注PHP中文网其他相关文章!