拦截信号Golang应用优雅关闭的操作方法.docx

拦截信号Golang应用优雅关闭的操作方法.docx

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多

拦截信号Golang应用优雅关闭的操作方法

目录从示例开始接收信号常见信号处理多个信号NotifyContext示例总结Golang不是像C语言的系统级编程语言,但仍提供了以下特性帮助开发者与底层操作系统进行交互,如信号(singals),os/singals包实现了这些功能。相对于其他语言处理OS信号采用复杂或冗余的方法,Golang内置OS包提供了易用的方法处理Unix信号,非常直接、简单。事实上,类unix系统中通常处理singal是必要的,本文介绍singal概念,并通过示例说明其应用场景。

从示例开始

假设场景:Golang应用在关闭时打印消息:ThankyouforusingGolang.首先新建main函数,函数体模拟执行一些业务,直到接收到结束命令。

funcmain(){

for{

fmt.Println(DoingWork)

time.Sleep(1*time.Second)

}

当运行应用,然后从OS发送执行kill信号(Ctrl+C),可能输出结果类似这样:

DoingWork

DoingWork

DoingWork

Processfinishedwithexitcode2

现在我们希望拦截kill信号并定义处理逻辑:打印必要的关闭信息。

接收信号

首先创建channe接收来自操作系统的命令,os包提供了signal接口处理基于OS规范信号实现。

killSignal:=make(chanos.Signal,1)

为了通知killSignal,需使用signal包中提供的Notify函数,第一个参数为Signal类型的channel,下一个参数接收一组发给通道的信号列表。

Notify(cchan-os.Signal,sig...os.Signal)

我们也可以使用syscall包通知特定命令的信号:

signal.Notify(cchan-os.Signal,syscall.SIGINT,syscall.SIGTERM)

为了处理信号,我们在main函数中使用killSignal通道等待interrupt信号,一旦接收到来自OS的命令,则打印结束消息并接收应用。现在把处理业务的循环代码移入独立的goroute中,这里定义一个匿名函数:

gofunc(){

for{

fmt.Println(DoingWork)

time.Sleep(1*time.Second)

}()

因为业务代码运行在独立routine中,main函数实现等待killSignal信号并在结束之前打印消息。

-killSignal

fmt.Println(ThanksforusingGolang!)

完整代码

下面把几个部分组装在一起,完整代码如下:

packagemain

import(

fmt

os

os/signal

time

funcmain(){

killSignal:=make(chanos.Signal,1)

signal.Notify(killSignal,os.Interrupt)

gofunc(){

for{

fmt.Println(DoingWork)

time.Sleep(1*time.Second)

-killSignal

fmt.Println(ThanksforusingGolang!)

}

运行程序,看到一直执行业务循环,直到接收到interrupt信号,打印消息并结束:

DoingWork

DoingWork

DoingWork

ThanksforusingGolang!

常见信号

对于命令行程序,当按CTRL+C时,会发送SIGINT信号,SIGINT是与指定特定信号数字相关联的名称。信号实际是可以有程序生成的软件中断,也是一种异步处理事件机制。通常为了安全起见,信号采用名称而不是数值生成。

大多数信号及其具体动作都是由操作系统定义的,并还在操作系统权限范围内执行相应功能。因此能够处理某些事件并不能让用户自由地使用系统,有些信号即使生成了也会被操作系统忽略,而由操作系统决定程序允许处理哪些信号。

举例,SIGKILL和SIGSTOP信号也可以被捕获、阻塞或忽略。因为这些信号对于保持操作系统功能的健全至关重要,在极端条件下为内核和root用户提供了停止进程的方法。与SI

文档评论(0)

184****8785 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档