简单说下,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