简单说下,linux shell 下的捕获信号的一些处理。

查看kill支持的signal,可以用参数-l 不是数字1。

 信号(signal)
 1 SIGHUP 挂起或父进程被杀死
 2 SIGINT 来自键盘的中断信号,通常是<CTRL-C>
 3 SIGQUIT 从键盘退出
 9 SIGKILL 无条件终止
 11 SIGSEGV 段(内存)冲突
 15 SIGTERM 软件终止(缺省杀进程信号)

 检测信号
 在编写shell脚本时,只需关心信号1、2、3和1 5。当脚本捕捉到一个信号后,它可能会采
 取下面三种操作之一:
 1) 不采取任何行动,由系统来进行处理。
 2) 捕获该信号,但忽略它。
 3) 捕获该信号,并采取相应的行动。

 大多数的脚本都使用第一种处理方法,这也是到目前为止本书中所有脚本所采取的处理
 方法。如果想要采取另外两种处理方法,必须使用trap命令。

trap可以使你在脚本中捕捉信号。该命令的一般形式为:

 trap name signal(s)

 其中,name是捕捉到信号以后所采取的一系列操作。实际生活中, name一般是一个专门
 用来处理所捕捉信号的函数。Name需要用双引号(“ ”)引起来。Signal就是待捕捉的信号。
 脚本在捕捉到一个信号以后,通常会采取某些行动。最常见的行动包括:
 1) 清除临时文件。
 2) 忽略该信号。
 3) 询问用户是否终止该脚本的运行。

 下表列出了一些最常见的trap命令用法:
 trap "" 2 3 忽略信号2和信号3,用户不能终止该脚本
 trap"commands" 2 3 如果捕捉到信号2或3,就执行相应的commands命令
 trap 2 3  复位信号2和3,用户可以终止该脚本
 也可以使用单引号(‘’)来代替双引号(“”);其结果是一样的。

举例

捕获信号,然后采取相应的cmd

#!/bin/bash
trap "my_exit" 2 3 9 15
HOLD1=/tmp/HOLD1.$$
HOLD2=/tmp/HOLD2.$$

my_exit ()
{
echo "receive......exit?"
echo "1:Yes"
echo "2:No"
echo "please choose 1 or 2 :"
read ANS
case $ANS in
1|y|Y)
echo "<CTRL_c> detected .. now cleaning up..wait"
rm /tmp/*.$$ 2>/dev/null
exit 1
;;
2|n|N) echo "choose 2"
 ;;
esac
 
}

echo "processing......"

while :
do
 df >>$HOLD1
 ps xa>>$HOLD2
done