专注各种脚本编程
Baidu
加入收藏夹
本站内容有下面分类知识,欢迎您的到来^_^
shell相关:指令篇 基础篇 脚本欣赏 编程实例 shell问问 shell视频教程 技巧篇 水平测试 E文资料 vi编辑器 高级Bash脚本编程指南
其他:mysql perl c语言 oracle
当前位置:| 主页>shell技巧/应用篇>

有关shell编程信号处理(即signal handling in shell programming)

百度收藏 QQ搜藏

在有些情况下,我们不希望在运行自己的shell脚本时被中断,比如说我们写得shell脚本设为某一用户的默认shell,让该用户进入系统后只能执行某一个工作,例如oracle数据库备份,我们当然不希望这个用户使用ctrl+C之类便进入到shell状态,做我们不希望做的事情。这里就用到了信号处理。

# kill -l
可以列出系统的信号名称,如下:

[/home/guest]kill -l
1) SIGHUP       2) SIGINT       3) SIGQUIT      4) SIGILL
5) SIGTRAP      6) SIGABRT      7) SIGEMT       8) SIGFPE
9) SIGKILL     10) SIGBUS      11) SIGSEGV     12) SIGSYS
13) SIGPIPE     14) SIGALRM     15) SIGTERM     16) SIGURG
17) SIGSTOP     18) SIGTSTP     19) SIGCONT     20) SIGCHLD
21) SIGTTIN     22) SIGTTOU     23) SIGIO       24) SIGXCPU
25) SIGXFSZ     27) SIGMSG      28) SIGWINCH    29) SIGPWR
30) SIGUSR1     31) SIGUSR2     32) SIGPROF     33) SIGDANGER
34) SIGVTALRM   35) SIGMIGRATE  36) SIGPRE      37) SIGVIRT
38) SIGALRM1    39) SIGWAITING  60) SIGKAP      61) SIGRETRACT
62) SIGSOUND    63) SIGSAK

不同的系统不一样,先前是sco5.0.5上的结果,
下面是HP-UX的结果,
1) HUP                  16) USR1                 31) RESERVED
2) INT                  17) USR2                 32) DIL
3) QUIT                 18) CHLD                 33) XCPU
4) ILL                  19) PWR                  34) XFSZ
5) TRAP                 20) VTALRM               35) bad trap
6) IOT                  21) PROF                 36) bad trap
7) EMT                  22) POLL                 37) RTMIN
8) FPE                  23) WINCH                38) RTMIN+1
9) KILL                 24) STOP                 39) RTMIN+2
10) BUS                  25) TSTP                 40) RTMIN+3
11) SEGV                 26) CONT                 41) RTMAX-3
12) SYS                  27) TTIN                 42) RTMAX-2
13) PIPE                 28) TTOU                 43) RTMAX-1
14) ALRM                 29) URG                  44) RTMAX
15) TERM                 30) LOST
下面是cygbin下的结果:
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL
5) SIGTRAP 6) SIGABRT 7) SIGEMT 8) SIGFPE
9) SIGKILL10) SIGBUS 11) SIGSEGV 12) SIGSYS
13) SIGPIPE14) SIGALRM 15) SIGTERM 16) SIGURG
17) SIGSTOP18) SIGTSTP 19) SIGCONT 20) SIGCHLD
21) SIGTTIN22) SIGTTOU 23) SIGIO 24) SIGXCPU
25) SIGXFSZ26) SIGVTALRM 27) SIGPROF 28) SIGWINCH
29) SIGLOST30) SIGUSR1 31) SIGUSR2
大同小异。

一共有31个信号,在很多情况下,信号可以用序号也可以用名称表示。
通常我们会忽略四个信号,包括:HUP INT QUIT,TSTP,也就是信号1,2,3,24
使用这样的语句可以使这些中断信号被忽略:

trap "" 1 2 3 24 或 trap "" HUP INT QUIT TSTP

用 trap :1 2 3 24 or trap HUP INT QUIT TSTP使其回复默认值。

用stty -a可以列出中断信号与键盘的对应,分别执行上面的命令后,运行tail -f /etc/passwd 然后尝试用键盘中断,试试两种情况(默认和忽略)下有何不同。
更方便的是我们可以用在shell中用trap定义我们自己的信号处理程序,就象在c中用signal一样,

如:trap “echo 'GO Away‘” INT

cleanup ()
{
       echo[/FONT] " catching signal..."
       rm /tmp/tmpfile
       exit
}
...
trap clearnup INT TERM
...
这样使我们的程序在退出时可以清理一些临时文件。
command list:
stty kill trap

上一篇:while用到重定向的困惑(sh的陷阱) 下一篇:编写SHELL程序实现‘按任意键继续’

power by soyo123 2007-2008