很多同学在日常使用 Linux 中会经常使用 kill 命令来杀死进程,有的直接使用 kill,有的使用 kill -9,有的使用 kill -3,他们是什么意思呢,有什么区别呢,今天我们就了解一下 Kill 命令和 Linux 中的信号。
Kill命令
kill命令的格式是 kill -Signal pid,其中 pid 就是进程的编号,signal是发送给进程的信号,默认参数下,kill 发送 SIGTERM(15)信号给进程,告诉进程,你需要被关闭,请自行停止运行并退出。
查看Kill命令的Signal信号列表可以使用命令:kill -l 来查看:
Linux Signal 信号
Linux支持POSIX标准信号和实时信号。下面给出Linux Signal的简表:
信号
取值
默认动作
含义(发出信号的原因)
SIGHUP
1
Term
终端的挂断或进程死亡
SIGINT
2
Term
来自键盘的中断信号
SIGQUIT
3
Core
来自键盘的离开信号
SIGILL
4
Core
非法指令
SIGABRT
6
Core
来自abort的异常信号
SIGFPE
8
Core
浮点例外
SIGKILL
9
Term
杀死
SIGSEGV
11
Core
段非法错误(内存引用无效)
SIGPIPE
13
Term
管道损坏:向一个没有读进程的管道写数据
SIGALRM
14
Term
来自alarm的计时器到时信号
SIGTERM
15
Term
终止
SIGUSR1
30,10,16
Term
用户自定义信号1
SIGUSR2
31,12,17
Term
用户自定义信号2
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
后台进程写终端
SIGBUS
10,7,10
Core
总线错误(内存访问错误)
SIGPOLL
Term
Pollable事件发生(Sys V),与SIGIO同义
SIGPROF
27,27,29
Term
统计分布图用计时器到时
SIGSYS
12,-,12
Core
非法系统调用(SVr4)
SIGTRAP
5
Core
跟踪/断点自陷
SIGURG
16,23,21
Ign
socket紧急信号(4.2BSD)
SIGVTALRM
26,26,28
Term
虚拟计时器到时(4.2BSD)
SIGXCPU
24,24,30
Core
超过CPU时限(4.2BSD)
SIGXFSZ
25,25,31
Core
超过文件长度限制(4.2BSD)
SIGIOT
6
Core
IOT自陷,与SIGABRT同义
SIGEMT
7,-,7
Term
SIGSTKFLT
-,16,-
Term
协处理器堆栈错误(不使用)
SIGIO
23,29,22
Term
描述符上可以进行I/O操作
SIGCLD
-,-,18
Ign
与SIGCHLD同义
SIGPWR
29,30,19
Term
电力故障(System V)
SIGINFO
29,-,-
与SIGPWR同义
SIGLOST
-,-,-
Term
文件锁丢失
SIGWINCH
28,28,20
Ign
窗口大小改变(4.3BSD, Sun)
SIGUNUSED
-,31,-
Term
未使用信号(will be SIGSYS)
一些信号的取值是硬件结构相关的(一般alpha和sparc架构用第一个值,i386、ppc和sh架构用中间值,mips架构用第三个值, – 表示相应架构的取值未知)。
SIGKILL和SIGSTOP信号不能被挂钩、阻塞或忽略。
在Linux 2.2(包括)内核之前,SIGSYS、SIGXCPU、SIGXFSZ和SIGBUS (SPARC和MIPS架构除外)的默认动作是终止进程,但没有core dump。Linux 2.4遵循POSIX.1-2001要求,这些信号的默认动作改为:终止进程同时做core dump。
进程可以通过使用sigaction和signal系统调用来改变信号的默认处理方式(使用signal的可移植性差)。进程可以选择下列3种信号处理方式中的一种:
执行默认操作;
忽略该信号;
捕获该信号,但是通过信号句柄来调用自定义的处理函数。
信号可能被阻塞。进程中的每个线程拥有独立的信号掩码,用来表示本线程的信号被阻塞。线程通过pthread_sigmask来设置它的信号掩码。单线程程序可以用sigprocmask来操作信号掩码。在多线程程序中,所有线程处理一个指定信号的默认行为都是一样的。
kill、kill -9、kill -3的区别
经过上面的学习,现在就知道他们的区别了吧。
kill 会默认传15代表的信号为SIGTERM,这是告诉进程你需要被关闭,请自行停止运行并退出,进程可以清理缓存自行结束,也可以拒绝结束。
kill -9代表的信号是SIGKILL,表示进程被终止,需要立即退出,强制杀死该进程,这个信号不能被捕获也不能被忽略。
kill -3可以打印进程各个线程的堆栈信息,kill -3 pid 后文件的保存路径为:/proc/${pid}/cwd,文件名为:antBuilderOutput.log
总结
如果是让进程自己执行退出离场程序就使用 kill 命令,这样进程可以自己执行一些清理动作然后退出。如果进程卡死,你需要记录当时的事故现场,那么应该用 kill -3 来记录事故现场的信息然后退出。如果你什么也不需要,就是要杀死一个进程那么就是用 kill -9 命令,很暴力的杀死它。