当前位置: 首页 > 知识库问答 >
问题:

是否有可能捕获Ctrl C信号并以“延迟”方式运行清理函数?

臧欣怿
2023-03-14

我想捕获从控制台发送的Ctrl CSIGINT)信号,并打印出一些部分运行总数。

这在戈兰可能吗?

注意:当我第一次发布这个问题时,我对Ctrl CSIGTERM而不是SIGINT感到困惑。

共有3个答案

养枫涟
2023-03-14

要稍微添加到其他答案中,如果您确实想要捕获SIGTERM(kill命令发送的默认信号),可以使用syscall。SIGTERM代替操作系统。打断请注意,系统调用接口是特定于系统的,可能无法在任何地方工作(例如,在windows上)。但它很好地兼顾了这两个方面:

c := make(chan os.Signal, 2)
signal.Notify(c, os.Interrupt, syscall.SIGTERM)
....
许学真
2023-03-14

这项工作:

package main

import (
    "fmt"
    "os"
    "os/signal"
    "syscall"
    "time" // or "runtime"
)

func cleanup() {
    fmt.Println("cleanup")
}

func main() {
    c := make(chan os.Signal)
    signal.Notify(c, os.Interrupt, syscall.SIGTERM)
    go func() {
        <-c
        cleanup()
        os.Exit(1)
    }()

    for {
        fmt.Println("sleeping...")
        time.Sleep(10 * time.Second) // or runtime.Gosched() or similar per @misterbee
    }
}
羊新翰
2023-03-14

您可以使用操作系统/信号包来处理传入信号CtrlC是SIGINT,因此您可以使用它来捕获操作系统。中断。

c := make(chan os.Signal, 1)
signal.Notify(c, os.Interrupt)
go func(){
    for sig := range c {
        // sig is a ^C, handle it
    }
}()

使程序终止并打印信息的方式完全取决于您。

 类似资料:
  • 问题内容: 我想捕获从控制台发送的()信号并打印出部分运行总计。 Golang有可能吗? 注意:当我第一次发布问题时,我对被代替感到困惑。 问题答案: 您可以使用os / signal包来处理输入信号。+ 是SIGINT,因此您可以使用它来捕获。 导致程序终止和打印信息的方式完全取决于您。

  • 问题内容: 任何Throwable都可以被捕获 输出: 因此,如果在初始化块期间做不好的事情,我希望能够捕获ExceptionInInitializerError。但是,以下操作无效: 输出: 并且如果我更改代码以另外捕获ArrayIndexOutOfBoundsException 被捕获的是ArrayIndexOutOfBoundsException: 谁能告诉我为什么呢? 问题答案: 顾名思义

  • 这个问题不是关于Rollbar tho:)

  • 问题内容: 我已使用批注将其用于获取计算的属性。我需要的是那些用注解注解的字段/获取器应延迟加载。 这甚至有可能吗? 谢谢 问题答案: 是的。只需使用@Basic(fetch = FetchType.LAZY) 注释属性的字段/ 获取器,然后使用hibernate提供的此ant任务即可为实体类进行字节码检测。否则,将默默忽略该属性的LAZY加载。 该文档包含有关如何使用此ant任务进行字节码检测的

  • 问题内容: 是否可以获取有关Golang中调用方函数的信息?例如,如果我有 我怎样才能得到那个叫? 我可以使用其他语言(例如,在C#中,我只需要使用class属性) 问题答案: 扩展我的评论,这是一些返回当前func调用者的代码 有关更多示例:https : //play.golang.org/p/cv-SpkvexuM

  • 问题内容: 此问题与跨域资源共享(CORS)有关。 如果在发出CORS请求时出现错误,Chrome(以及AFAIK其他浏览器)会将错误记录到错误控制台。消息示例可能如下所示: XMLHttpRequest无法加载。原产地不被访问控制允许来源允许的。 我想知道是否有办法以编程方式获取此错误消息?我尝试将调用包装在try/catch中,也尝试添加事件处理程序。两者均未收到错误消息。 问题答案: 看到: