在有些情况下,我们不希望在运行自己的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 |