尽管常常用来杀进程,但kill命令的真正作用是send a signal to a process(向一个进程发送一个信号),kill命令的语法是:
kill [options] <pid> […]
其中,pid可以是负的,用于选择整个进程组(参见ps命令中的PGID列)。当pid为-1时,代表所有除了kill进程和init进程外的所有进程。
kill命令发出的默认信号是TERM,因此常常被用来结束进程。但实际上我们可以使用-L参数列出所有支持的信号,请注意:
Your shell (command line interpreter) may have a built-in kill command. You may need to run the command described here as /bin/kill to solve the conflict.
即:
命令行解释器(Shell)可能内置了kill命令,因此可能需要使用/bin/kill。
例如,在Ubuntu环境下就需要使用/bin/kill:
否则会报错:
-bash: kill: L: invalid signal specification
以Ubuntu系统为例,所列出的信号量包括:
1 HUP 2 INT 3 QUIT 4 ILL 5 TRAP 6 ABRT 7 BUS 8 FPE 9 KILL 10 USR1 11 SEGV 12 USR2 13 PIPE 14 ALRM 15 TERM 16 STKFLT 17 CHLD 18 CONT 19 STOP 20 TSTP 21 TTIN 22 TTOU 23 URG 24 XCPU 25 XFSZ 26 VTALRM 27 PROF 28 WINCH 29 POLL 30 PWR 31 SYS
我们可以通过三种方式来指定信号,例如:-9、-KILL或-SIGKILL。在这里信号中,常用的信号主要包括HUP、INT、KILL、STOP、CONT和0。
1、HUP。根据约定,当发送一个HUP(1)时,大多数服务器进程(所有常用的进程)都会进行复位操作并重新加载它们的配置文件。如果想要更改配置而不停止并重新启动服务,就可以使用HUP信号该命令。在对配置文件作必要的更改后,发出该命令以动态更新服务配置。例如, 我们常常使用这个信号来重启nginx等Web服务器或重新加载配置,因为是从容地重启,因此服务是不中断的。2、INT。是当用户输入<Ctrl+C>时由终端驱动程序发送的信号。这是一个终止当前操作的请求,如果捕获了这个信号,一些简单的程序应该退出,或者允许自给被终止,这也是程序没有捕获到这个信号时的默认处理方法。拥有命令行或者输入模式的那些程序应该停止它们在做的事情,清除状态,并等待用户的再次输入。3、KILL。杀死,我们常常使用这个信号来立即强制结束某个进程的执行。4、TERM。终止,kill命令默认发出的信号,请求彻底终止某项执行操作。
每个信号的具体含义可以使用:
man 7 signal
命令查看:
上图中的Action一列的值指明了每个信号默认的处理方式,包括:
Term Default action is to terminate the process.Ign Default action is to ignore the signal.Core Default action is to terminate the process and dump core (see core(5)).Stop Default action is to stop the process.Cont Default action is to continue the process if it is currently stopped.
下表列出了所有的信号含义:
Signal 信号 |
Value 值 |
Action 默认动作 |
Comment 含义(发出信号的原因) |
Comment中文翻译 |
原始的POSIX.1-1990标准中的信号 | ||||
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) | 来自abort的异常信号 |
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) | 来自alarm的计时器到时信号 |
SIGTERM | 15 | Term | Termination signal | 终止 |
SIGUSR1 | 30,10,16 | Term | User-defined signal 1 | 用户自定义信号1 |
SIGUSR2 | 31,12,17 | Term | User-defined signal 2 | 用户自定义信号2 |
SIGCHLD | 20,17,18 | Ign | Child stopped or terminated | 子进程停止或终止 |
SIGCONT | 19,18,25 | Cont | Continue if stopped | 如果停止,继续执行 |
SIGSTOP | 17,19,23 | Stop | Stop process | 非来自终端的停止信号 |
SIGTSTP | 18,20,24 | Stop | Stop typed at terminal | 来自终端的停止信号 |
SIGTTIN | 21,21,26 | Stop | Terminal input for background process | 后台进程读终端 |
SIGTTOU | 22,22,27 | Stop | Terminal output for background process | 后台进程写终端 |
不在POSIX.1-1990中但在SUSv2和POSIX.1-2001中的信号 | ||||
SIGBUS | 10,7,10 | Core | Bus error (bad memory access) | 总线错误(错误的内存访问) |
SIGPOLL | Term | Pollable event (Sys V).Synonym for SIGIO | Pollable事件发生(Sys V),与SIGIO同义 | |
SIGPROF | 27,27,29 | Term | Profiling timer expired | 统计分布图用计时器到时 |
SIGSYS | 12,-,12 | Core | Bad argument to routine (SVr4) | 非法系统调用(SVr4) |
SIGTRAP | 5 | Core | Trace/breakpoint trap | 跟踪/断点自陷 |
SIGURG | 16,23,21 | Ign | Urgent condition on socket (4.2BSD) | socket紧急信号(4.2BSD) |
SIGVTALRM | 26,26,28 | Term | Virtual alarm clock (4.2BSD) | 虚拟计时器到时(4.2BSD) |
SIGXCPU | 24,24,30 | Core | CPU time limit exceeded (4.2BSD) | 超过CPU时限(4.2BSD) |
SIGXFSZ | 25,25,31 | Core | File size limit exceeded (4.2BSD) | 超过文件长度限制(4.2BSD) |
其他常见的信号 | ||||
SIGIOT | 6 | Core | IOT trap. A synonym for SIGABRT | IOT自陷,与SIGABRT同义 |
SIGEMT | 7,-,7 | Term | ||
SIGSTKFLT | -,16,- | Term | Stack fault on coprocessor (unused) | 协处理器堆栈错误(不使用) |
SIGIO | 23,29,22 | Term | I/O now possible (4.2BSD) | 描述符上可以进行I/O操作 |
SIGCLD | -,-,18 | Ign | A synonym for SIGCHLD | 与SIGCHLD同义 |
SIGPWR | 29,30,19 | Term | Power failure (System V) | 电力故障(System V) |
SIGINFO | 29,-,- | A synonym for SIGPWR | 与SIGPWR同义 | |
SIGLOST | -,-,- | Term | File lock lost (unused) | 文件锁丢失 |
SIGWINCH | 28,28,20 | Ign | Window resize signal (4.3BSD, Sun) | 窗口大小改变(4.3BSD, Sun) |
SIGUNUSED | -,31,- | Term | Synonymous with SIGSYS | 未使用信号(will be SIGSYS) |
其中:
1、蓝色的是POSIX.1-1990标准信号。SIGKILL和SIGSTOP信号不能被挂钩、阻塞或忽略。
2、青色的是SUSv2和POSIX.1-2001定义的信号。在Linux 2.2(包括)内核之前,SIGSYS、SIGXCPU、SIGXFSZ和SIGBUS (SPARC和MIPS架构除外)的默认动作是终止进程,但没有core dump。Linux 2.4遵循POSIX.1-2001要求,这些信号的默认动作改为:终止进程同时做core dump。
3、橙色的是其他常见的信号。信号29在Alpha上为SIGINFO / SIGPWR ,在Sparc上为SIGLOST。SIGEMT没有在POSIX.1-2001中说明,但是在大多数的Unices中仍然能见到,典型的默认动作是终止进程并做core dump。SIGPWR没有在POSIX.1-2001中说明,在使用它的一些Unices中典型的默认动作是忽略。SIGIO没有在POSIX.1-2001中说明,在使用它的一些Unices中典型的默认动作是忽略。
一个进程可以通过使用sigaction和signal系统调用来改变信号的默认处理方式(使用signal的可移植性差)。进程可以选择下列3种信号处理方式中的一种:
1、执行默认操作;2、忽略该信号;3、捕获该信号,但是通过信号句柄来调用自定义的处理函数。
信号可能被阻塞。进程中的每个线程拥有独立的信号掩码,用来表示本线程的信号被阻塞。线程通过pthread_sigmask来设置它的信号掩码。单线程程序可以用sigprocmask来操作信号掩码。在多线程程序中,所有线程处理一个指定信号的默认行为都是一样的。