跟结束进程相关的那些信号

前言

项目中在使用kube-keepalived-vip时遇到了keepalived相关的Bug, 原本计划测试最新版的keepalived看是否存在同样的问题. 在将keepalived升级到当前最新版本v2.0.7之后发现每次执行kubectl delete pod <kube-keepalived-vip pod>都会出现segfault的内核错误, 且较大概率会连带出现keepalived的僵尸进程, 但对比发现通过手动执行kill -9结束keepalived进程却没有这个问题. 翻了一下runc的代码发现kubectl delete实际上(默认情况)是通过发给进程一个SIGTERM的信号让其退出, 这就是为什么手动执行kill -9没有出现同样的问题. 这里索性整理了一下与结束进程相关的信号的区别和联系.

信号

  • 什么是信号
  • 信号是软件中断, 很多比较重要的应用程序都需要处理信号. 信号提供了一种处理异步事件的方法. 例如, 终端用于键入中断健, 会通过信号机制停止一个程序, 或及早终止管道中的下一个程序.
  • UNIX系统的早期版本就已经提供信号机制, 但是这些系统(V7)所提供的信号模型并不可靠. 信号可能丢失, 并且在执行临界区代码时, 进程很难关闭所选择的信号. 4.3BSD和SVR3对信号模型都做了修改, 增加了可靠信号机制. 但是Berkeley和AT&T所做的更改之间并不兼容. 幸运的是, POSIX.1对可靠信号例程进行了标准化.
  • 查看信号列表
  • 在Linux系统当中可直接通过kill命令加-l参数列出所有的信号, 主要依据头文件/usr/include/linux/signal.h.
  • 可以看到所有的信号都包含一个正整数序号(序号0有特殊用途)和一个以SIG开头的简称
[[email protected] ~]# kill -l
 1) SIGHUP  2) SIGINT   3) SIGQUIT  4) SIGILL   5) SIGTRAP
 6) SIGABRT 7) SIGBUS   8) SIGFPE   9) SIGKILL  10) SIGUSR1
11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM
16) SIGSTKFLT   17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
21) SIGTTIN 22) SIGTTOU 23) SIGURG  24) SIGXCPU 25) SIGXFSZ
26) SIGVTALRM   27) SIGPROF 28) SIGWINCH    29) SIGIO   30) SIGPWR
31) SIGSYS  34) SIGRTMIN    35) SIGRTMIN+1  36) SIGRTMIN+2  37) SIGRTMIN+3
38) SIGRTMIN+4  39) SIGRTMIN+5  40) SIGRTMIN+6  41) SIGRTMIN+7  42) SIGRTMIN+8
43) SIGRTMIN+9  44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9  56) SIGRTMAX-8  57) SIGRTMAX-7
58) SIGRTMAX-6  59) SIGRTMAX-5  60) SIGRTMAX-4  61) SIGRTMAX-3  62) SIGRTMAX-2
63) SIGRTMAX-1  64) SIGRTMAX
[[email protected] ~]#

结束进程相关的信号

通过kill -l可以看到操作系统总共提供了64种信号, 这里只列举了与结束进程相关的几种信号, 分别是信号序号为1、2、3、9、15的SIGHUP、SIGINT、SIGKILL、SIGTERM

  • SIGHUP

    • 如果终端接口检测到一个连接断开, 则将此信号送给与该终端相关的控制进程. (与之相关的命令为nohup)
    • 如果终端会话首进程终止, 也产生此信号. 在这种情况下, 此信号送给前台进程组中的每一个进程.
    • 通常用此信号通知守护进程再次读取它们的配置文件. 选用SIGHUP的理由是, 守护进程不会有控制终端, 通常绝不会接收到这种信号.
    • 这也是kube-keepalived-vip当中reload keepalived.conf的方式
kill -1 <pid>
  • SIGINT

    • 用户按下中断健(一般采用DELETE或Ctrl+C)时, 终端驱动程序产生此信号并发送至前台进程组中的每一个进程.
    • 当一个进程组在运行时失控, 特别是当进程正在屏幕上产生大量不需要的输出时, 常用此信号终止.
kill -2 <pid>
  • SIGQUIT

    • 当用户在终端上按退出键(一般采用Ctrl +  ), 中断驱动程序产生此信号, 并发送给前台进程组中的所有进程.
    • 此信号不仅终止前台进程组(如SIGINT), 同时将产生一个core文件(关于如何查看core文件, 见另一片博文《如何查看core文件》).
    • 设计的初衷为以较温和地方式退出程序, 让程序在退出前可以清理一些临时文件或者做别的处理, 但建议最好不好清理临时文件, 方便gdb配合core文件进行Debug.
kill -3 <pid>
  • SIGKILL

    • 强制立即结束进程, 相较于其他信号, SIGKILL信号不能够被进程捕获, 也不能够被忽略, 因此总是能够结束进程(如果不行, 那一定是操作系统的Bug).
    • 不能够阻塞该信号
    • 使用该信号一定要想清楚后果
kill -9 <pid>
  • SIGTERM

    • kill命令默认发送的终止信号.
    • 该信号可由应用程序捕获, 故使用SIGTERM也让程序有机会在退出之前做好清理工作, 从而优雅地终止.
kill -15 <pid>

结束语

很多时候很多莫名其妙的问题或者Bug都是因为我们对一些细节的不理解或者掌握的不够透彻, 就比如结束一个进程就有这么多种方式, 你是否每一种方式都能够说清楚呢? 基础是否夯实正是从日常工作的小事积累和体现出来.

参考

  1. https://www.gnu.org/software/libc/manual/html_node/Termination-Signals.html
  2. 《Unix环境高级编程》
  3. Linux man page

原文地址:https://www.cnblogs.com/dspace/p/9825723.html

时间: 2024-08-01 13:55:57

跟结束进程相关的那些信号的相关文章

一、进程与信号之进程相关系统调用

进程调用函数wait(),waitpid() #include <sys/types.h> #include <sys/wait.h> pid_t wait(int *status) //等待所有子进程,返回任一终止子进程的状态,阻塞方式 pid_t waitpid(pid_t pid,int *status,int options) //指定子进程pid等待终止返回,option设置是否阻塞 status参数 为空时,代表任意状态结束的子进程,若不为空,则代表指定状态结束的子进程

Linux查看和结束进程命令详解

在ubuntu中,终止一个进程或终止一个正在运行的程序,一般是通过 kill .killall.pkill.xkill 等进行. ------------------------------------------------------------------- 先看两个例子: 例子一:结束某个程序,如Firefox 键入命令: pkill firefox 例子二: 结束某个进程,如find 先用ps命令来查看该进程对应的PID. 键入ps,显示如下: PID TTY TIME COMMAND

linux下多进程的文件拷贝与进程相关的一些基础知识

之前实现了用文件IO的方式可以实现文件的拷贝,那么对于进程而言,我们是否也可以实现呢? 答案是肯定的. 进程资源: 首先我们先回顾一下,进程的运行需要哪些资源呢?其资源包括CPU资源,内存资源,当然还有时间片资源,我们都知道进程是有 栈, 堆,  只读数据段,  数据段(已初始化的全局变量静态变量),bss段(未初始化的),   代码段还有一组寄存器值. 进程命令: 另外我们也可以通过 ps  -ef |grep 进程名命令来查看进程号(PID)和父进程号(PPID),之后还可以通过 ps au

linux strace-跟踪进程的系统调用或是信号产生情况,lstrace-跟踪己丑年调用库函数情况,进程跟踪调试命令

本工具可以用来做大多数排除,比如mount一个NFS,很慢,找不出原因,我们可以使用strace命令来跟中mount这个经常所有的调用过程. strace 命令是一种强大的工具,它能够显示所有由用户空间程序发出的系统调用. strace 显示这些调用的参数并返回符号形式的值.strace 从内核接收信息,而且不需要以任何特殊的方式来构建内核. 下面记录几个常用 option . 1 -f -F选项告诉strace同时跟踪fork和vfork出来的进程 2 -o xxx.txt 输出到某个文件.

APUE: 进程相关的系统调用和库函数

进程正常终止5种方式: 1.main函数返回 2.调用exit库函数 3.调用_exit或_Exit系统调用 4.最后一个线程从其启动例程返回 5.最后一个线程调用pthread_exit库函数 进程异常终止3种方式: 1.调用abort库函数,产生abort信号. 2.接到一个信号并终止 3.最后一个线程对取消请求做出响应 init进程:pid=1的进程,如果父进程先于子进程终止,子进程就被init进程收养. 孤儿进程:父进程先于子进程退出,子进程被init进程收养,这个子进程就是孤儿进程.

Linux # Kubuntu 假死,结束进程方法

分析思路: 要知道运行了哪些进程,结束的目标进程是哪些,如何得到运行中的进程,需要哪些操作. 借助搜索引擎,搜索关键字:kconsole 列出进程,查询相关信息,文后参考链接 执行过程: ps aux 列出运行进程 (记录结束的目标进程的 pid,比如 firefox pid 为 22481) 或者 grep firefox ,将显示 22481,即为 pid 接着 kill 22481 ,即可. 备注: 这些命令详细介绍可以看下面链接 参考: Win/Mac/Linux(gnome|kde)

Linux系统编程——进程的控制:结束进程、等待进程结束

结束进程 首先,我们回顾一下 C 语言中 continue, break, return 的作用: continue: 结束本次循环 break: 跳出整个循环,或跳出 switch() 语句 return: 结束当前函数 而我们可以通过 exit() 或 _exit() 来结束当前进程. 所需头文件: #include <stdlib.h> void exit(int value); 功能: 结束调用此函数的进程. 参数: status:返回给父进程的参数(低 8 位有效),至于这个参数是多

C# 保护进程不被结束(源代码)防任务管理器结束进程

C# 保护进程不被结束(源代码)防任务管理器结束进程 Posted on 2013-03-25 16:03 快乐家++ 阅读(3173) 评论(3) 编辑 收藏 闲来无事,英语又学的太痛苦.看到我妈妈电脑开起在,就坐上去看看新闻,听听音乐.哎,突然间,老毛病又烦了,想起原来一直有个编程的问题没有解决——禁止别人用任务管理器,结束自己的程序进程(.NET程序).带着这个问题,我开始Google,开始baidu,又开始编程了.和原来的搜索结果一样,什么东西都是一筹莫展,得到的答案永远是:C#没有办法

linux_c开发(5-3)进程间通讯_信号通讯

信号通讯 信号(signal)机制是UNIX系统中最为古老的进程间通信机制,有很多条件可以产生一个信号: 1. 当用户按某些按键时,产生信号. 2. 硬件异常产生信号:除数为零,无效的存储访问等等.这些信号通常有硬件检测得到,将其通知内核,然后内核产生适当的信号通知进程,例如: 内核对正在访问一个无效存储区的进程产生一个SIGSEGV信号. 3.进程用kill函数将信号发送给另一个进程. 4. 用户可以用kill命令将信号发送给其他进程. 信号类型 几种常见的信号 SIGHUP: 从终端发来的结