信号

时间:2019-04-16 23:59:05  来源:igfitidea点击:
  1. Linux同时支持POSIX可靠信号(“标准信号”)和POSIX实时信号。
  2. 信号只不过是Linux和Unix操作系统中的某种进程间通信(在一个或多个进程或命令中的多个线程之间交换数据的技术)。
  3. 信号用于发送到进程或命令,以便通知发生的事件。

例如,在运行一个名为“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
  1. 在编写shell脚本时,您必须了解signal及其值。
  2. 你不能使用(捕获)所有可用的信号。
  3. 有些信号是永远捕捉不到的。例如,信号SIGKILL(9)和SIGSTOP(19)不能被捕获、阻止或忽略。

下表列出常用的信号编号、描述及是否能被捕获:

数值常量说明默认动作可捕获的
00成功终止进程。
1SIGHUP控制终端检测到挂起或控制进程死亡。此外,用于为许多UNIX/Linux守护进程重新加载配置文件。终止进程。
2SIGINT从键盘中断(Ctrl+C)终止进程。
3SIGQUIT退出键盘(Ctrl-.或者,Ctrl-4,或者,在虚拟控制台上,SysRq键)终止进程并将core dump下来。
4SIGILL终止进程并将core dump下来。非法指令。
6SIGABRT中止信号-软件产生。终止进程并将core dump下来。
8SIGFPE浮点异常。终止进程并将core dump下来。
9SIGKILLkill信号终止进程。
15SIGTERM终止信号终止进程。
20SIGSTP停止键入tty (CTRL+z)停止进程。

kill命令示例

kill命令可以将上述所有信号发送给命令和进程。然而,命令只有在被编程时,对这些信号进行了识别才会给出响应。

特别有用的信号包括:

  1. SIGHUP(1) -控制终端检测到挂起或控制进程死亡。
  2. SIGINT(2) -从键盘中断。
  3. SIGKILL(9) -杀死信号,即杀死正在运行的进程。
  4. SIGSTOP(19) -停止进程。
  5. 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