每个平台的信号定义或许有些不同。下面列出了POSIX中定义的信号。

Linux 使用34-64信号用作实时系统中。

命令man 7 signal提供了官方的信号介绍。

在POSIX.1-1990标准中定义的信号列表信号

动作

说明

SIGHUP

1

Term

终端控制进程结束(终端连接断开)

SIGINT

2

Term

用户发送INTR字符(Ctrl+C)触发

SIGQUIT

3

Core

用户发送QUIT字符(Ctrl+/)触发

SIGILL

4

Core

非法指令(程序错误、试图执行数据段、栈溢出等)

SIGABRT

6

Core

调用abort函数触发

SIGFPE

8

Core

算术运行错误(浮点运算错误、除数为零等)

SIGKILL

9

Term

无条件结束程序(不能被捕获、阻塞或忽略)

SIGSEGV

11

Core

无效内存引用(试图访问不属于自己的内存空间、对只读内存空间进行写操作)

SIGPIPE

13

Term

消息管道损坏(FIFO/Socket通信时,管道未打开而进行写操作)

SIGALRM

14

Term

时钟定时信号

SIGTERM

15

Term

结束程序(可以被捕获、阻塞或忽略)

SIGUSR1

30,10,16

Term

用户保留

SIGUSR2

31,12,17

Term

用户保留

SIGCHLD

20,17,18

Ign

子进程结束(由父进程接收)

SIGCONT

19,18,25

Cont

继续执行已经停止的进程(不能被阻塞)

SIGSTOP

17,19,23

Stop

停止进程(不能被捕获、阻塞或忽略)

SIGTSTP

18,20,24

Stop

停止进程(可以被捕获、阻塞或忽略)

SIGTTIN

21,21,26

Stop

后台程序从终端中读取数据时触发

SIGTTOU

22,22,27

Stop

后台程序向终端中写数据时触发

在SUSv2和POSIX.1-2001标准中的信号列表:信号

动作

说明

SIGTRAP

5

Core

Trap指令触发(如断点,在调试器中使用)

SIGBUS

0,7,10

Core

非法地址(内存地址对齐错误)

SIGPOLL

Term

Pollable event (Sys V). Synonym for SIGIO

SIGPROF

27,27,29

Term

性能时钟信号(包含系统调用时间和进程占用CPU的时间)

SIGSYS

12,31,12

Core

无效的系统调用(SVr4)

SIGURG

16,23,21

Ign

有紧急数据到达Socket(4.2BSD)

SIGVTALRM

26,26,28

Term

虚拟时钟信号(进程占用CPU的时间)(4.2BSD)

SIGXCPU

24,24,30

Core

超过CPU时间资源限制(4.2BSD)

SIGXFSZ

25,25,31

Core

超过文件大小资源限制(4.2BSD)

kill pid 与 kill -9 pid的区别

kill pid的作用是向进程号为pid的进程发送SIGTERM(这是kill默认发送的信号),该信号是一个结束进程的信号且可以被应用程序捕获。若应用程序没有捕获并响应该信号的逻辑代码,则该信号的默认动作是kill掉进程。这是终止指定进程的推荐做法。

kill -9 pid 则是向进程号为pid的进程发送 SIGKILL(该信号的编号为9),从本文上面的说明可知,SIGKILL既不能被应用程序捕获,也不能被阻塞或忽略,其动作是立即结束指定进程。通俗地说,应用程序根本无法“感知”SIGKILL信号,它在完全无准备的情况下,就被收到SIGKILL信号的操作系统给干掉了,显然,在这种“暴力”情况下,应用程序完全没有释放当前占用资源的机会。事实上,SIGKILL信号是直接发给init进程的,它收到该信号后,负责终止pid指定的进程。在某些情况下(如进程已经hang死,无法响应正常信号),就可以使用 kill -9 来结束进程。

应用程序如何优雅退出?

Linux Server端的应用程序经常会长时间运行,在运行过程中,可能申请了很多系统资源,也可能保存了很多状态,在这些场景下,我们希望进程在退出前,可以释放资源或将当前状态dump到磁盘上或打印一些重要的日志,也就是希望进程优雅退出(exit gracefully)。

Go中的Signal发送和处理golang中对信号的处理主要使用os/signal包中的两个方法:

notify方法用来监听收到的信号

stop方法用来取消监听

编写代码1.监听全部信号

2.监听指定信号

3.优雅退出go守护进程

扩展

DEMOpackage main

import (

"fmt"

"os"

"os/signal"

)

// 监听全部信号

func main() {

c := make(chan os.Signal)

// 监听所有信号

signal.Notify(c)

fmt.Println("启动了程序")

s :=

fmt.Println("收到信号:", s)

}

DEMO2package main

import (

"fmt"

"os"

"os/signal"

"syscall"

)

// 监听全部信号

func main() {

c := make(chan os.Signal)

// 监听指定信号

signal.Notify(c, os.Interrupt, os.Kill, syscall.SIGUSR1, syscall.SIGUSR2)

fmt.Println("启动了程序")

s :=

fmt.Println("收到信号:", s)

}

DEMO3package main

import (

"fmt"

"os"

"os/signal"

"syscall"

"time"

)

// 优雅退出go守护进程

func main() {

c := make(chan os.Signal)

// 监听信号

signal.Notify(c, syscall.SIGHUP, syscall.SIGINT, syscall.SIGTERM, syscall.SIGQUIT, syscall.SIGUSR1, syscall.SIGUSR2)

go func() {

for s := range c {

switch s {

case syscall.SIGHUP, syscall.SIGINT, syscall.SIGTERM:

fmt.Println("退出:", s)

ExitFunc()

case syscall.SIGUSR1:

fmt.Println("usr1", s)

case syscall.SIGUSR2:

fmt.Println("usr2", s)

default:

fmt.Println("其他信号:", s)

}

}

}()

fmt.Println("启动了程序")

sum := 0

for {

sum++

fmt.Println("休眠了:", sum, "秒")

time.Sleep(1 * time.Second)

}

}

func ExitFunc() {

fmt.Println("开始退出...")

fmt.Println("执行清理...")

fmt.Println("结束退出...")

os.Exit(0)

}

linux进程优雅退出,Go 的信号处理和优雅退出相关推荐

  1. Golang信号处理和优雅退出守护进程

    Golang中的信号处理 信号类型 个平台的信号定义或许有些不同.下面列出了POSIX中定义的信号. Linux 使用34-64信号用作实时系统中. 命令 man signal 提供了官方的信号介绍. ...

  2. linux进程退出所有tcp数据才发送,深入理解Node.js 进程与线程(8000长文彻底搞懂)...

    前言 进程与线程是一个程序员的必知概念,面试经常被问及,但是一些文章内容只是讲讲理论知识,可能一些小伙伴并没有真的理解,在实际开发中应用也比较少.本篇文章除了介绍概念,通过Node.js 的角度讲解进 ...

  3. Linux 进程控制(创建/退出/等待/替换)

    目录 进程创建 fork()函数 fork返回值 fork写时拷贝 fork失败原因 fork用法 进程退出 退出场景 常见的退出方法 正常退出 异常退出 _exit()系统调用 exit()函数 _ ...

  4. Linux进程退出详解(do_exit)--Linux进程的管理与调度(十四)

    Linux进程的退出 linux下进程退出的方式 正常退出 从main函数返回return 调用exit 调用_exit 异常退出 调用abort 由信号终止 _exit, exit和_Exit的区别 ...

  5. 主进程退出后子进程还会存在吗?_【干货】Linux进程模型 全解

    关注.星标公众号,直达精彩内容 ID:嵌入式情报局 作者:情报小哥 1进程与程序 01 什么是进程 ?  什么是进程 ? 进程(process)是具有独立功能的程序单次运行,是操作系统进行资源分配的基 ...

  6. linux进程莫名其妙被kill,Linux运行程序时,程序进程莫名退出(被杀死)

    Linux运行程序时,程序进程莫名退出(被杀死) 1.知识点 1)Linux程序进程被杀,日志突然中止,可以考虑是否因为程序占用内存过高,导致系统内存不足,为避免系统崩溃,系统寻找内存占用最大的进程k ...

  7. 《Linux进程概念,进程创建退出等待替换,环境变量等基础操作 ---总结》

    前言 Linux系统的进程概念,进程状态,以及操作创建进程,还有环境变量及相关指令,程序地址空间等一些知识的梳理,将自己的理解总结如下,希望和各位一起进步,一起学习. 以下是本篇文章正文内容. 文章目 ...

  8. Linux 进程:进程退出返回值的获取

    目录 一.对输出参数status的理解 二.获取进程退出返回值 1.位运算 (1)异常退出码 (2)进程返回值 2.宏函数   我们常使用函数 wait 和 waitpid 来执行进程等待的功能:处理 ...

  9. Linux进程3:父进程等待(wait,waitpid)子进程退出并收集子进程退出状态,僵尸进程

    父进程等待(wait,waitpid)子进程退出并收集子进程退出状态 1.父进程为什么要等待子进程退出? 创建子进程目的:------干活 我们要知道干活结束没. 子进程退出状态不被收集,变成僵尸进程 ...

最新文章

  1. ajax按钮禁止重复提交,Ajax禁止重复提交
  2. 在双系统电脑再安装一个ubuntu18.04
  3. java编程实践开发项目,帮你突破瓶颈
  4. 为什么要使用EJB?
  5. linux 固定usb设备,linux下多个usb设备固定名称方法
  6. 给出一个包含n个整数的数列,问整数a在数列中的第一次出现是第几个。
  7. STM32利用库函数驱动OLED
  8. hadoop2.x伪集群搭建全流程
  9. opencart china 书籍主题
  10. linux - 流量切分线路
  11. python用pyinstaller生成exe时报错 TypeError: an integer is required (got type bytes)
  12. 面试知识储备:新浪微博Android客户端的实现
  13. 51单片机---麻雀虽小,五脏俱全
  14. java注解约束参数为固定值_java自定义注解的实现及属性设置
  15. 使用css形变实现一个立方体
  16. 记一次Redis哨兵机制【主机挂了无法切换其他从机】的问题
  17. 某Xavier载板硬件方案
  18. android课程设计体重测量仪,智能体重检测仪设计与实现
  19. 机械键盘的 黑轴/茶轴/青轴/红轴 有什么区别
  20. 光猫灯显示正常但是报651错误解决办法

热门文章

  1. 10分钟学会 SQL 语言核心知识点!
  2. 163会员邮箱是什么格式,163邮箱推广群发软件有哪些
  3. Adobe 数字出版解决方案 Digital Publishing Suite (Indesign 制作iPad电子书) 系列之一: 环境准备
  4. 震惊了!《长安十二时辰》就是一部深度介绍通信、云计算、大数据的黑科技科普剧...
  5. python修改图像的教程
  6. 前端实现纯css文本显示省略号
  7. numpy -- 基础方法操作 array和asarray数据类型常用基础方法
  8. 试一试哦(网赚项目)
  9. js获取滚动条的高度
  10. 汽车租赁系统需求列表