Seb*_*oli 191 signals go sigterm
我想捕获从控制台发送的Ctrl+C(SIGINT)信号并打印出一些部分运行总计.
这在Golang有可能吗?
注意:当我第一次发布问题时,我很困惑Ctrl+C而SIGTERM不是SIGINT.
Lil*_*ard 241
您可以使用os/signal包来处理传入的信号.^ C是SIGINT,因此您可以使用它来捕获os.Interrupt.
c := make(chan os.Signal, 1)
signal.Notify(c, os.Interrupt)
go func(){
for sig := range c {
// sig is a ^C, handle it
}
}()
Run Code Online (Sandbox Code Playgroud)
您导致程序终止和打印信息的方式完全取决于您.
小智 97
这有效:
package main
import (
"fmt"
"os"
"os/signal"
"syscall"
"time" // or "runtime"
)
func cleanup() {
fmt.Println("cleanup")
}
func main() {
c := make(chan os.Signal)
signal.Notify(c, os.Interrupt, syscall.SIGTERM)
go func() {
<-c
cleanup()
os.Exit(1)
}()
for {
fmt.Println("sleeping...")
time.Sleep(10 * time.Second) // or runtime.Gosched() or similar per @misterbee
}
}
Run Code Online (Sandbox Code Playgroud)
ada*_*mar 25
要稍微添加其他答案,如果您确实想要捕获SIGTERM(kill命令发送的默认信号),则可以使用syscall.SIGTERMos.Interrupt来代替.请注意,系统调用接口是特定于系统的,并且可能无法在任何地方工作(例如在Windows上).但它可以很好地捕捉到两者:
c := make(chan os.Signal, 2)
signal.Notify(c, os.Interrupt, syscall.SIGTERM)
....
Run Code Online (Sandbox Code Playgroud)
gra*_*ron 17
在上面接受的答案中有(在发布时)一两个小错字,所以这里是清理版本.在这个例子中,我在接收Ctrl + C时停止CPU分析器.
// capture ctrl+c and stop CPU profiler
c := make(chan os.Signal, 1)
signal.Notify(c, os.Interrupt)
go func() {
for sig := range c {
log.Printf("captured %v, stopping profiler and exiting..", sig)
pprof.StopCPUProfile()
os.Exit(1)
}
}()
Run Code Online (Sandbox Code Playgroud)
拼接后,所有上述内容似乎都能正常工作,但gobyexample的信号页面有一个非常干净完整的信号捕获示例.值得添加到此列表中.