【发布时间】:2016-01-14 21:56:51
【问题描述】:
我注意到以exec.Command 开始的进程即使通过signal.Notify 拦截了中断调用也会被中断。我已经完成了以下示例来说明问题:
package main
import (
"log"
"os"
"os/exec"
"os/signal"
"syscall"
)
func sleep() {
log.Println("Sleep start")
cmd := exec.Command("sleep", "60")
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,它将打印:
2015/10/16 10:05:50 Sleep start
^C2015/10/16 10:05:52 Receved Ctrl + C
2015/10/16 10:05:52 Sleep stop
显示sleep 命令被中断。虽然 Ctrl+C 被成功捕获,但主程序并没有退出,只是 sleep 命令受到影响。
知道如何防止这种情况发生吗?
【问题讨论】:
标签: multithreading go subprocess goroutine sigint