Golang捕捉信号

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) } } 然后我

我想在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执行的命令生成的所有可能的信号。我对围棋还很陌生,如果有任何帮助,我将不胜感激。

围棋中有三种执行程序的方法:

  • 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
            }
        }()
        // ...
    }