当前位置: 首页 > 面试题库 >

Golang捕获信号

龚俊捷
2023-03-14
问题内容

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


问题答案:

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

  1. syscall包含syscall.Exec,syscall.ForkExec,syscall.StartProcess的软件包
  2. os与os.StartProcess一起打包
  3. os/exec与exec.Command一起打包

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

os.StartProcess给您一个不错的os.Process结构,您可以调用Signal。os/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.Kill或Process.Signal映射信号。您可以Process.Pid从syscall.StartProcess或从中获取pid



 类似资料:
  • 问题内容: 我们有一个大型的golang应用程序,它使用记录器(实际上是自定义记录器)将输出写入定期轮换的日志文件中。 但是,当应用程序崩溃或出现panic()时,这些消息将变为标准错误。 有什么方法可以覆盖使用记录仪的紧急功能? 问题答案: 据我所知,您无法将恐慌的输出重定向到标准错误或记录器。最好的办法是将标准错误重定向到可以在外部或在程序内部执行的文件。 对于我的rclone程序,我重定向了

  • 问题内容: 在Linux下的python 2.6中,我可以使用以下命令来处理TERM信号: 除了仅一次设置一个信号,是否可以为该过程接收的所有信号设置处理程序? 问题答案: 您可以循环浏览信号模块中的信号并进行设置。

  • 我想在try块中捕获PyCharm的stop信号(当stop被按下时),但是我不知道这个信号是什么或者如何在代码中捕获它。JetBrains在他们的文档中没有提供这方面的见解。 我尝试将其捕获为,但它似乎根本不是异常。 这在编程上是完全可以捕获的吗?

  • 我有一个存储过程似乎没有正确记录错误。 代码有错误,但 catch 块似乎未生效。 try块相当长,但错误部分很简单,并且在最后出现,所以我已经对此进行了预测。 proc失败的错误是我们的老朋友“列名或提供的值的数量与表定义不匹配”。我已经修复了这个错误 - 这是一个愚蠢的懒惰错误 - 但我感到困惑为什么我的错误日志记录过程似乎没有工作 - 没有行入到我的 ExtractsErrorLog 表中。

  • 问题内容: 这是我的代码(运行): 输出: 问题:第2部分和第3部分有什么区别?为什么第2部分输出“ 44444”而不是“ 43210”? 问题答案: “第2部分”闭包捕获变量“ i”。当闭包(稍后)中的代码执行时,变量“ i”具有在range语句的最后一次迭代中具有的值,即。‘4’。因此 输出的一部分。 “第3部分”在其闭包中未捕获任何外部变量。如规格所述: 每次执行“ defer”语句时,将照

  • 问题内容: 测试代码如下: 我认为输出将是:java,python,erlang,cpp,go;但是输出是:go go go go go; 怎么了 问题答案: 就是这样写函数,把动词变成函数