我想在Go中实现“流程包装器”。基本上它将执行的是启动一个进程(比如说一个节点服务器)并监视它(捕获诸如SIGKILL,SIGTERM之类的信号…)
我认为要做的方法是使用syscall.Exec以下命令在go例程中启动节点服务器:
syscall.Exec
func launchCmd(path string, args []string) { err := syscall.Exec(path, args, os.Environ()) if err != nil { panic(err) } }
然后,我想捕获由执行的命令生成的所有可能的信号syscall。我是Go的新手,我们将不胜感激。
syscall
Go中有三种执行程序的方式:
os
os/exec
syscall.StartProcess是低级别。它返回a uintptr作为句柄。
uintptr
os.StartProcess给您一个不错的os.Process结构,您可以调用Signal。os/exec让您io.ReaderWriter可以在管道上使用。两者都在syscall内部使用。
os.StartProcess
os.Process
io.ReaderWriter
读取 从 您自己的进程以外的进程发送的信号似乎有些棘手。如果有可能,syscall将能够做到。在更高级别的程序包中,我看不到任何明显的东西。
要接收信号,您可以使用signal.Notify像这样通知:
sigc := make(chan os.Signal, 1) signal.Notify(sigc, syscall.SIGHUP, syscall.SIGINT, syscall.SIGTERM, syscall.SIGQUIT) go func() { s := <-sigc // ... do something ... }()
您只需要更改您想听的信号即可。如果不指定信号,它将捕获所有可以捕获的信号。
您将使用syscall.Kill或Process.Signal映射信号。您可以Process.Pid从syscall.StartProcess或从中获取pid 。
Process.Pid