Я заметил, что процессы, начатые с exec.Command
, прерываются, даже когда вызов прерывания перехвачен через signal.Notify
. Я сделал следующий пример, чтобы показать проблему:Предотвращение прерывания Ctrl + C от exec.Command в Golang
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
.
Любая идея, как предотвратить это?
Это не работает для окон, поскольку в 'SysProcAttr' под окнами нет' Setpgid'. Любые альтернативы? – tkausl