[转帖]kill及kill -9的用法及如何实现进程的优雅退出

kill,用法,如何,实现,进程,优雅,退出 · 浏览次数 : 0

小编点评

**1. kill与signals** * kill是指向某个指定的进程或进程组发送指定信号,从而结束该进程/进程组。 * 常见的信号包括 SIGTERM、SIGINT、SIGQUIT、SIGILL、SIGABRT、SIGFPE、SIGKILL、SIGSEGV、SIGPIPE、SIGALRM、SIGTERM等。 **2. kill pid与kill -9 pid的区别** * kill pid的作用是向进程号为pid的进程发送SIGTERM信号。 * kill -9 pid的作用是向进程号为pid的进程发送SIGKILL信号。 **3. 应用程序如何优雅退出** * 应用程序可以通过捕获SIGTERM信号来实现优雅退出。 * 在处理SIGTERM信号时,应该设置一个flag变量,表示进程已经收到SIGTERM信号。 * 在主进程的main()中,通过检测flag变量,如果被设置为true,则退出while()循环,执行释放资源或dump状态或记录日志等动作的代码。

正文


1. kill与signals

        我们这里所说的kill是指作为shell command的那个kill(相对地,linux 系统中还有个叫做kill的system call, man 2 kill可查看其功能及用法),shell终端中输入man kill可以看到,kill的作用是向某个指定的进程或进程组发送指定信号,从而结束该进程/进程组。-s选项可以指定要发送的具体信号,如果没有指定,则默认发送SIGTERM信号至指定进程/进程组,若进程没有捕获该信号的逻辑,则SIGTERM的作用是终止进程。
 
        kill支持发送的信号列表可以通过 kill -l查看 ,而这些信号的具体含义可以通过man 7 signal查看。在我的机器上,man 7 signal输出的POSIX标准信号如下所示(kill支持的信号还有POSIX没有定义的非标准信号,这里没有摘出,感兴趣的同学可以通过man查看)。
[plain] 
Signal     Value     Action   Comment  
-------------------------------------------------------------------------  
SIGHUP        1       Term    Hangup detected on controlling terminal  
                              or death of controlling process  
SIGINT        2       Term    Interrupt from keyboard  
SIGQUIT       3       Core    Quit from keyboard  
SIGILL        4       Core    Illegal Instruction  
SIGABRT       6       Core    Abort signal from abort(3)  
SIGFPE        8       Core    Floating point exception  
SIGKILL       9       Term    Kill signal  
SIGSEGV      11       Core    Invalid memory reference  
SIGPIPE      13       Term    Broken pipe: write to pipe with no readers  
SIGALRM      14       Term    Timer signal from alarm(2)  
SIGTERM      15       Term    Termination signal  
SIGUSR1   30,10,16    Term    User-defined signal 1  
SIGUSR2   31,12,17    Term    User-defined signal 2  
SIGCHLD   20,17,18    Ign     Child stopped or terminated  
SIGCONT   19,18,25            Continue if stopped  
SIGSTOP   17,19,23    Stop    Stop process  
SIGTSTP   18,20,24    Stop    Stop typed at tty  
SIGTTIN   21,21,26    Stop    tty input for background process  
SIGTTOU   22,22,27    Stop    tty output for background process  
 
     上面的输出结果中:
       第1列为信号名;
       第2列为对应的信号值,需要注意的是,有些信号名对应着3个信号值,这是因为这些信号值与平台相关,将man手册中对3个信号值的说明摘出如下,the first one is usually valid for alpha and sparc, the middle one for i386, ppc and sh, and the last one for mips.
       第3列为操作系统收到信号后的动作,Term表明默认动作为终止进程,Ign表明默认动作为忽略该信号,Core表明默认动作为终止进程同时输出core dump,Stop表明默认动作为停止进程。
       第4列为对信号作用的注释性说明,浅显易懂,这里不再赘述。
       需要特别说明的是,SIGKILL和SIGSTOP这两个信号既不能被应用程序捕获,也不能被操作系统阻塞或忽略。

2. 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来结束进程。
        若通过kill结束的进程是一个创建过子进程的父进程,则其子进程就会成为孤儿进程(Orphan Process),这种情况下,子进程的退出状态就不能再被应用进程捕获(因为作为父进程的应用程序已经不存在了),不过应该不会对整个linux系统产生什么不利影响。

3. 应用程序如何优雅退出

         Linux Server端的应用程序经常会长时间运行,在运行过程中,可能申请了很多系统资源,也可能保存了很多状态,在这些场景下,我们希望进程在退出前,可以释放资源或将当前状态dump到磁盘上或打印一些重要的日志,也就是希望进程优雅退出(exit gracefully)。
        从上面的介绍不难看出,优雅退出可以通过捕获SIGTERM来实现。具体来讲,通常只需要两步动作:
        1)注册SIGTERM信号的处理函数并在处理函数中做一些进程退出的准备。信号处理函数的注册可以通过signal()或sigaction()来实现,其中,推荐使用后者来实现信号响应函数的设置。信号处理函数的逻辑越简单越好,通常的做法是在该函数中设置一个bool型的flag变量以表明进程收到了SIGTERM信号,准备退出。
 
        2)在主进程的main()中,通过类似于while(!bQuit)的逻辑来检测那个flag变量,一旦bQuit在signal handler function中被置为true,则主进程退出while()循环,接下来就是一些释放资源或dump进程当前状态或记录日志的动作,完成这些后,主进程退出。

与[转帖]kill及kill -9的用法及如何实现进程的优雅退出相似的内容:

[转帖]kill 参数表

https://www.cnblogs.com/alix-1988/p/14331898.html kill命令格式:kill -Signal pidpid是进程号,可以用 ps 命令查出 signal是发送给进程的信号, 默认参数下,kill 发送SIGTERM(15)信号给进程,告诉进程,你需要

[转帖]如何kill一条TCP连接?

https://www.cnblogs.com/codelogs/p/16838850.html 简介# 如果你的程序写得有毛病,打开了很多TCP连接,但一直没有关闭,即常见的连接泄露场景,你可能想要在排查问题的过程中,先临时kill一波泄露的连接。又比如你要验证程序在遇到网络错误时的自愈能力,想手

[转帖] 如何kill一条TCP连接?

https://www.cnblogs.com/codelogs/p/16838850.html 原创:扣钉日记(微信公众号ID:codelogs),欢迎分享,转载请保留出处。 简介# 如果你的程序写得有毛病,打开了很多TCP连接,但一直没有关闭,即常见的连接泄露场景,你可能想要在排查问题的过程中,

[转帖]show processlist中kill锁表语句与慢sql

https://blog.51cto.com/u_11310506/2071463 show processlist中kill锁表语句与慢sql 1 单个kill mysql> show processlist; mysql > kill 251; #批量kill 1)查找Lockd语句 mysql

[转帖]nginx中用到的kill命令

1、kill命令 1.1、kill命令简介 我们都知道,想要在Linux中终止一个进程有两种方式,如果是前台进程可以使用Ctrl+C键进行终止;如果是后台进程,那么需要使用kill命令来终止。(其实Ctrl+C也是kill命令)。 kill命令的格式是: kill -signal pid 其中 pi

[转帖]linux 上进程被随机kill掉,如何监测和查询;谁杀了我的进程;Who sends a SIGKILL to my process mysteriously on ubuntu server

https://www.cnblogs.com/xuyaowen/p/linux-audit.html 今天跑实验,发现进程被随机kill。咨询了服务器上的其他同学,他们说之前也发生过,一直存在。看来可能有可能不是我自己程序的原因,只能自己动手解决了。 在 Who sends a SIGKILL t

[转帖]某游戏海外版本堆外内存泄露排查

https://www.jianshu.com/p/cae00d9c99fe 某游戏海外版本堆外内存泄露排查 现象 线上有部分服务器用top发现Java进程内存占用占比达到99,而且出现了有一个服务器被Linux OOM Kill 排查 选择了110服,该机器的Java进程最大堆内存设置的是9710

[转帖]玩火的容器内存控制 CGroup - 容器基础拾遗 Part 1

https://www.modb.pro/db/555818 引 我们在谈容器内存时,到底在谈什么? CGroup 内存说明 强制回收内存 memory.force_empty 基于内存阈值水位的通知 不要 OOM Kill,只是暂停 memory.stat memory.usage_in_byte

[转帖]一次fork引发的惨案!

https://www.cnblogs.com/xuanyuan/p/15502289.html “你还有什么要说的吗?没有的话我就要动手了”,kill程序最后问道。 这一次,我没有再回答。 只见kill老哥手起刀落,我短暂的一生就这样结束了··· 我是一个网络程序,一直以来都运行在Windows系

[转帖]等待事件 enq:TX - row lock contention分析与解决

6月30日,数据库发生了大量锁表。大概持续1小时,并且越锁越多。后来通过业务人员停掉程序,并kill掉会话后解决。 几天后再EM上查看CPU占用: CPU发生了明显等待。 主要是由于enq:TX - row lock contention等待事件造成。 等待事件—enq:TX - row lock