信号
- Linux同时支持POSIX可靠信号(“标准信号”)和POSIX实时信号。
- 信号只不过是Linux和Unix操作系统中的某种进程间通信(在一个或多个进程或命令中的多个线程之间交换数据的技术)。
- 信号用于发送到进程或命令,以便通知发生的事件。
例如,在运行一个名为“ls -R /”的命令时,您可以按 CTRL+C(或者 Break)取消命令执行。只要按下 CTRL+C,一个名为SIGINT(2)的信号就会从键盘上发出,表示中断。当SIGINT发送到ls命令时,Linux中断进程的正常执行流。
但是,还可以为 CTRL+C注册一个信号处理程序,并采取某种操作,比如忽略它,或者在ls命令被SIGINT中断时在屏幕上显示一条消息。
这时就需要使用 trap命令来捕获信号,并在Linux shell脚本中处理错误。
可以向命令和进程发送各种信号。
例如,要终止前台进程,可以按 Ctrl+C组合键。
要杀死后台进程,你可以使用kill命令和发送SIGTERM(终止命令):
kill -TERM pid kill -TERM 1234
如何将信号发给进程
可以使用pkill命令、kill命令和killall命令向命令/进程和shell脚本发送各种信号。
kill - 向进程发送一个信号
kill的默认信号是TERM。
列出可用的信号:
# 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
所有信号定义在文件/usr/include/linux/signal.h
中。
查看SIGTSTP信号的数字
kill -l SIGTSTP
- 在编写shell脚本时,您必须了解signal及其值。
- 你不能使用(捕获)所有可用的信号。
- 有些信号是永远捕捉不到的。例如,信号SIGKILL(9)和SIGSTOP(19)不能被捕获、阻止或忽略。
下表列出常用的信号编号、描述及是否能被捕获:
数值 | 常量 | 说明 | 默认动作 | 可捕获的 |
---|---|---|---|---|
0 | 0 | 成功 | 终止进程。 | 是 |
1 | SIGHUP | 控制终端检测到挂起或控制进程死亡。此外,用于为许多UNIX/Linux守护进程重新加载配置文件。 | 终止进程。 | 是 |
2 | SIGINT | 从键盘中断(Ctrl+C) | 终止进程。 | 是 |
3 | SIGQUIT | 退出键盘(Ctrl-.或者,Ctrl-4,或者,在虚拟控制台上,SysRq键) | 终止进程并将core dump下来。 | 是 |
4 | SIGILL | 终止进程并将core dump下来。 | 非法指令。 | 是 |
6 | SIGABRT | 中止信号-软件产生。 | 终止进程并将core dump下来。 | 是 |
8 | SIGFPE | 浮点异常。 | 终止进程并将core dump下来。 | 是 |
9 | SIGKILL | kill信号 | 终止进程。 | 否 |
15 | SIGTERM | 终止信号 | 终止进程。 | 是 |
20 | SIGSTP | 停止键入tty (CTRL+z) | 停止进程。 | 是 |
kill命令示例
kill命令可以将上述所有信号发送给命令和进程。然而,命令只有在被编程时,对这些信号进行了识别才会给出响应。
特别有用的信号包括:
- SIGHUP(1) -控制终端检测到挂起或控制进程死亡。
- SIGINT(2) -从键盘中断。
- SIGKILL(9) -杀死信号,即杀死正在运行的进程。
- SIGSTOP(19) -停止进程。
- SIGCONT(18) -如果停止,则继续进程。
发送一个杀死信号到进程1234:
kill -9 1234 或者 kill -SIGKILL 1234 或者 kill -KILL 1234
killall -根据名称来杀死进程
killall向所有运行指定命令的进程发送一个信号。如果没有指定信号名称,则发送SIGTERM。
要终止所有firefox进程(子进程和父进程),输入:
## killall processName killall firefox-bin
向firefox发送KILL 信号:
killall -s SIGKILL firefox-bin
pkill - kill进程
pkill命令是另一个命令,它有附加的选项,可以根据进程的名称、用户名、组名、终端、UID、EUID和GID来终止进程。
它将向每个进程发送指定的信号(默认为SIGTERM),而不是将它们列在stdout上。
向php-cgi进程发送一个终止信号:
pkill -KILL php-cgi
上面的例子会杀死所有用户的php-cgi进程。
Linux如何杀死指定用户的进程?
在kill时使用-u
指定用户名:
pkill -KILL -u alice php-cgi
Linux如何让进程重新读取它的配置文件
pkill -HUP sshd