一尘不染

Golang捕获信号

go

我想在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。我是Go的新手,我们将不胜感激。


阅读 193

收藏
2020-07-02

共1个答案

一尘不染

Go中有三种执行程序的方式:

  1. syscall包含syscall.Execsyscall.ForkExecsyscall.StartProcess的软件包
  2. osos.StartProcess一起打包
  3. os/execexec.Command一起打包

syscall.StartProcess是低级别。它返回a
uintptr作为句柄。

os.StartProcess给您一个不错的os.Process结构,您可以调用Signalos/exec让您io.ReaderWriter可以在管道上使用。两者都在syscall内部使用。

读取 您自己的进程以外的进程发送的信号似乎有些棘手。如果有可能,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.KillProcess.Signal映射信号。您可以Process.Pidsyscall.StartProcess或从中获取pid

2020-07-02