一、简介
trap命令是shell的一个内建命令,用于在脚本中指定如何处理对应的信号。比方说,通常脚本接收到系统发送过来的SIGINT信号时,其默认动作为退出进程,但是我们可以使用trap命令指定当脚本接收到SIGINT信号时的动作,而不是单纯执行其默认动作。
二、trap命令的使用
1、trap命令的语法
trap [-lp] [[COMMANDS] signals ...]
-l:打印当前系统支持的信号;
-p:打印当前trap的设置;
2、信号类型
在linux系统中产生信号的方式大体上可以分为三类:硬件产生、软件产生和键盘输入。其信号类型有62种,在系统中可以通过trap -l
或kill -l
命令来查看当前系统支持的信号类型。
常用的信号类型包括:
SIGHUP:这个信号常用于在用户终端连接结束的时候发出,通常是在终端的控制进程结束时,通知该终端下的所有进程终止运行。
SIGINT:程序终止信号,通过按键Ctrl+C发出该信号,用于通知前台进程组终止进程。
SIGKILL:用于立即结束进程的运行,这个信号不能被阻塞、处理和忽略,当发现系统中有进程无法终止,可尝试发送这个信号终止进程。
这里转一个比较详细的signal类型介绍:
http://www.jb51.net/LINUXjishu/173601.html
三、使用案例
- trap信号,退出进程并打印相应的信息:
#!/bin/bash
trap "echo "quit.";exit 2" 2
trap -p
for i in {1..20};do
if [ $i -eq 10 ];then
trap 2 #恢复信号的默认动作
elif [ $i -eq 15 ];then
#trap '' 2 #忽略信号的动作,取消注释后,无法使用Ctrl+C中断read命令;
read -p "test." test
sleep
fi
ping -w 1 -c 1 188.88.88.$i &>/dev/null
result=$?
if [ $result -ge 0 ];then
echo "ping 188.88.88.$i succcess."
else
echo "ping 188.88.88.$i fail."
fi
done
[root@localhost tmp]# ./trap.sh
trap -- 'echo quit.;exit 2' SIGINT
ping 188.88.88.1 succcess.
ping 188.88.88.2 succcess.
ping 188.88.88.3 succcess.
^Cquit.
[root@localhost tmp]# ./trap.sh
trap -- 'echo quit.;exit 2' SIGINT
ping 188.88.88.1 succcess.
ping 188.88.88.2 succcess.
ping 188.88.88.3 succcess.
ping 188.88.88.4 succcess.
ping 188.88.88.5 succcess.
ping 188.88.88.6 succcess.
ping 188.88.88.7 succcess.
ping 188.88.88.8 succcess.
ping 188.88.88.9 succcess.
ping 188.88.88.10 succcess.
ping 188.88.88.11 succcess.
^Cping 188.88.88.12 succcess.
ping 188.88.88.13 succcess.
^Cping 188.88.88.14 succcess.