我想在Go中实现"流程包装器"。 基本上它将执行的是启动一个进程(比如说节点服务器)并监视它(捕获诸如SIGKILL,SIGTERM之类的信号...)

我认为方法是使用syscall.Exec在go例程中启动节点服务器:

然后,我想捕捉由syscall执行的命令生成的所有可能的信号。 我是Go的新手,我们将不胜感激。


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

  • syscall软件包,包含syscall.Exec,syscall.ForkExec,syscall.StartProcess
  • 带有os.StartProcess的os软件包
  • 带有exec.Command的os/exec
  • syscall.StartProcess是低级别。它返回uintptr作为句柄。

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

    读取从您自己的进程以外的进程发送来的信号似乎有些棘手。如果有可能,syscall将能够做到。在更高级别的程序包中,我看不到任何明显的东西。

    要接收信号,您可以使用信号。

    您只需要更改您想听的信号即可。如果不指定信号,它将捕获所有可以捕获的信号。

    您将使用syscall.Kill或Process.Signal映射信号。您可以从Process.Pid或从syscall.StartProcess获取pid。


    您可以使用signal.Notify: