Linux使用信号与系统上运行的进程进行通信!系统和应用程序生成的信号有30多个,常见的如图:

信号 描述
1 SIGHUP 挂起进程
2 SIGINT 终端进程
3 SIGQUIT 停止进程
9 SIGKILL 无条件终止进程
15 SIGTERM 如果可能的话终止进程
17 SIGSTOP 无条件停止,但不终止进程
18 SIGTSTP 停止或暂停进程,但不终止进程
19 SIGCONT 重新启动停止的进程

默认情况下,bash shell会忽略它接收的任何SIGQUIT(3)和SIGTERM(15)信号。但是,bash shell会处理它收到的任何SIGHUP(1)和SIGINT(2)信号


生成信号:

bash shell可以使用键盘上的组合键,生成两个基本的Linux信号。若需要暂停或者停止,就可以派上用场!

  1. 中断进程(Ctrl+C)可以生成SIGINT信号

  2. 暂停进程(Ctrl+Z)可以生成SIGTSTP信号
    中断进程和暂停进程不同,暂停进程仍然保留在内存中,能够从停止的地方继续运行

[root@localhost ~]# sleep 5
[1]+  Stopped                 sleep 5
方括号[1]:数字1是shell分配的作业编号(job number)
[root@localhost ~]# ps au
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root      6904  0.0  0.0   4916  1520 pts/1    Ss   11:06   0:00 -bash
root      7548  0.0  0.0   3960   476 pts/1    T    15:34   0:00 sleep 5
root      7555  0.0  0.0   4504   936 pts/1    R+   15:38   0:00 ps au
ps命令将停止作业的状态显示为T,只需要再次键入exit命令,shell将退出,并终止停止作业!
还可以使用Kill命令终止它!
[root@localhost ~]# kill -9 7548



捕捉信号:
trap命令指定能够通过shell脚本监控和拦截linux信号。如果脚本收到trap命令中列出的信号,它将不被shell处理
trap命令格式:
trap commands signals
#!/bin/bash
trap "echo Haha" SIGINT SIGTERM
echo "This is a test program"
count=1
while [ $count -le 10 ]
do
  echo "Loop #$count"
  sleep 10
  count=$[ $count +1 ]
done
  echo "This is the end of the test program"
[root@localhost ~]# ./test48.sh 
This is a test program
Loop #1
Loop #2
Loop #3
Loop #4
Haha
Loop #5
Haha
Loop #6
Haha
Loop #7
Haha
Loop #8
Haha
Loop #9
Haha
Loop #10
Haha
每次按Ctrl+C组合键时,脚本执行trap命令中指定的echo语句,显示“Haha ”
捕获脚本退出:
命令格式:trap command EXIT
#!/bin/bash
trap "echo byebye" EXIT
count=1
while [ $count -le 5 ]
do
  echo "loop #$count"
  sleep 3
  count=$[ $count + 1 ]
done
[root@localhost ~]# ./test49.sh 
loop #1
loop #2
loop #3
loop #4
loop #5
byebye
按Ctrl+C组合键时,出发trap命令


移除捕获:
要移除捕获,使用破折号作为命令和想要恢复正常行为的信号列表:
#!/bin/bash
trap "echo byebye" EXIT
count=1
while [ $count -le 5 ]
do
  echo "loop #$count"
  sleep 3
  count=$[ $count + 1 ]
done
trap - EXIT
echo "I just removed the trap"
[root@localhost ~]# ./test49.sh 
loop #1
loop #2
loop #3
loop #4
loop #5
I just removed the trap