曲径通幽论坛

 找回密码
 立即注册
搜索
查看: 6799|回复: 2
打印 上一主题 下一主题

trap

[复制链接]

4917

主题

5879

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34382
跳转到指定楼层
楼主
发表于 2009-2-4 22:03:43 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
trap 命令用来说明在接收到信号后的动作。这命令常用在当一个脚本被中断时整理这个脚本。以前,shell总是用数字来表示信号,但在新的脚本里,应该使用 signal.h头文件中的名字,而其前缀 SIG 则会被忽略。要查看表示信号的数字,可以使用 trap -l来查看。如下表所示:
[root@localhost graphi_dir]# trap -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

trap 命令被传递给要发生的动作--其后跟着要捕捉的信号:
                      trap command signal

记得,脚本通常是从顶往下解释的,所以必须在你希望保护的那部分脚本之前说明 trap 命令。

重置 trap 条件为默认,只要简单的把命令说明为 - 。忽略信号,则设置命令为空字符串 '' 。一个不带参数的 trap 命令打印出当前 trap的列表 和 动作(actions) 。

查看手册第7部分可以了解到更多的 signal 信息: man 7 signal
 
上面列表中蓝色加亮部分的较为重要的信号包含在 X/Open 标准中。

4917

主题

5879

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34382
沙发
 楼主| 发表于 2009-2-4 22:05:02 | 只看该作者

trap 举例

代码:
#!/bin/bash

trap 'rm -f /tmp/my_tmp_file_$$' INT

echo creating file /tmp/my_tmp_file_$$

date > /tmp/my_tmp_file_$$

echo "press interrupt (CTRL-C) to interrupt..."

while [ -f /tmp/my_tmp_file_$$ ]; do
         echo File exists
         sleep 1
done
echo The file no longer exists

trap 2   #忽略 arg 选项后,信号使用原始值,不能写成 INT 这种形式
echo creating file /tmp/my_tmp_file_$$
date > /tmp/my_tmp_file_$$

echo "press interrupt (control-c) to interrupt..."
while [ -f /tmp/my_tmp_file_$$ ]; do
         echo File exists
         sleep 1
done

echo we never get here
exit 0

脚本说明
第1行,使用了 trap 命令,当捕捉到 INT 信号时,就会执行“rm -f /tmp/my_tmp_file_$$”;
第2行,echo 出要建立/tmp/my_tmp_file_$$文件的信息($$为当前进程的ID号);
第3行,建立文件;
第4行,提示按下 ctrl + c 中断 while 循环(在 while 循环中,会一直测试 /tmp/my_tmp_file_$$ 是否存在);

那么,如果第 4 行中的 while 循环按下 ctrl + c 组合键时,INT 信号就要被捕捉到,然后执行动作:rm -f /tmp/my_tmp_file_$$
接着就会 echo 出文件被删除不存在的信息。

在语句 trap 2 中,指示只要捕捉到 INT 信号,就会按照默认的方式退出--原来在那里被 ctrl+c 就在哪里退,而不会执行到:
echo we never get here
这里!

4917

主题

5879

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34382
板凳
 楼主| 发表于 2012-3-21 11:51:03 | 只看该作者

触发 WINCH 信号

WINCH 信号是在终端窗口尺寸发生改变时触发的信号,参考下面的代码:
[Bash shell] 纯文本查看 复制代码
#!/bin/sh


trap 'temp_func' WINCH


function temp_func() {
    echo "hello size changed"
}


sleep    3 


stty columns 80

运行输出:
root@bt:~# sh tmp.sh
hello size changed
在 3 秒后触发 SIGWINCH 信号,因此函数被调用。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|曲径通幽 ( 琼ICP备11001422号-1|公安备案:46900502000207 )

GMT+8, 2024-4-29 06:35 , Processed in 0.085825 second(s), 22 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表