Golang捕捉信号
我想在Go中实现一个“流程包装器”。基本上,它要做的就是启动一个进程(比如说一个节点服务器)并对其进行监控(捕捉信号,比如SIGKILL、SIGTERM…) 我认为方法是使用Golang捕捉信号,go,signals,system-calls,Go,Signals,System Calls,我想在Go中实现一个“流程包装器”。基本上,它要做的就是启动一个进程(比如说一个节点服务器)并对其进行监控(捕捉信号,比如SIGKILL、SIGTERM…) 我认为方法是使用syscall.Exec在go例程中启动节点服务器: func launchCmd(path string, args []string) { err := syscall.Exec(path, args, os.Environ()) if err != nil { panic(err) } } 然后我
syscall.Exec
在go例程中启动节点服务器:
func launchCmd(path string, args []string) {
err := syscall.Exec(path, args, os.Environ())
if err != nil {
panic(err)
}
}
然后我想捕获由
syscall执行的命令生成的所有可能的信号。我对围棋还很陌生,如果有任何帮助,我将不胜感激。围棋中有三种执行程序的方法:
syscall
带有
os
带有
os/exec
带有
是低水平的。它返回一个uintptr
作为句柄
os.StartProcess
为您提供了一个很好的os.Process
结构,您可以调用它os/exec
为您提供在管道上使用的io.ReaderWriter
。两者都在内部使用syscall
读取进程以外的进程发送的信号似乎有点棘手。如果可能的话,syscall
将能够做到这一点。我在更高级别的软件包中没有看到任何明显的东西
要接收信号,您可以这样使用:
sigc := make(chan os.Signal, 1)
signal.Notify(sigc,
syscall.SIGHUP,
syscall.SIGINT,
syscall.SIGTERM,
syscall.SIGQUIT)
go func() {
s := <-sigc
// ... do something ...
}()
sigc:=make(信道操作信号,1)
信号通知(sigc,
syscall.SIGHUP,
syscall.SIGINT,
syscall.SIGTERM,
syscall.SIGQUIT)
go func(){
s:=您可以使用:
导入(
“操作系统”
“操作系统/信号”
“系统调用”
)
func main(){
信号通道:=接通(信道操作信号,2)
signal.Notify(signalChannel、os.Interrupt、syscall.SIGTERM)
go func(){
sig:=Thx我会试试。想法是让upstart监控这个包装器,它只是用来跟踪发生了什么,这样我就可以捕获输入到程序中的信号(例如^C)但是无法获取由syscall执行的程序生成的信号。有什么想法吗?@rmonjo您试图捕获从您的程序或发送到的信号吗?我想捕获从我在syscall
中执行的程序发送的信号。我尝试了您的解决方案,当我使用syscall.Exec
时,程序似乎是分叉的,只是退出。但是,使用os/exec
,我可以捕获诸如子级退出之类的信号。@rmonjo信号。Notify
捕获发送到程序的信号。从中捕获可能有点棘手。精确的回答有点。。
import (
"os"
"os/signal"
"syscall"
)
func main() {
signalChannel := make(chan os.Signal, 2)
signal.Notify(signalChannel, os.Interrupt, syscall.SIGTERM)
go func() {
sig := <-signalChannel
switch sig {
case os.Interrupt:
//handle SIGINT
case syscall.SIGTERM:
//handle SIGTERM
}
}()
// ...
}