免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 7726 | 回复: 15

shell 编程中的信号处理(signal handling in shell programming  关闭 [复制链接]

论坛徽章:
0
发表于 2002-03-17 20:54 |显示全部楼层
[这个贴子最后由valentine在 2002/03/17 08:57pm 编辑]

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

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

HUP INT QUIT[BR]ILL TRAP ABRT[BR]EMT FPE KILL[BR]BUS SEGV SYS[BR]PIPE ALRM TERM[BR]USR1 USR2 CHLD[BR]PWR WINCH URG[BR]POLL STOP TSTP[BR]CONT TTIN TTOU[BR]VTALRM PROF XCPU[BR]XFSZ[BR]

共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

论坛徽章:
8
白羊座
日期:2015-01-21 18:35:03巳蛇
日期:2015-02-03 17:30:37处女座
日期:2015-02-03 17:31:02羊年新春福章
日期:2015-02-03 17:31:21巨蟹座
日期:2015-02-05 16:01:06申猴
日期:2015-02-05 16:01:31摩羯座
日期:2015-02-05 16:01:41酉鸡
日期:2015-02-05 16:02:37
发表于 2002-03-17 21:32 |显示全部楼层

shell 编程中的信号处理(signal handling in shell programming

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

论坛徽章:
0
发表于 2002-03-17 23:07 |显示全部楼层

shell 编程中的信号处理(signal handling in shell programming

不同的系统不一样,先前是sco5.0.5上的结果,
下面是HP-UX的结果,
1) HUP                  16) USR1                 31) RESERVED
2) INT                  17) USR2                 32) DIL
3) QUIT                 1 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
FPE                  23) WINCH                3 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                 2 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 SIGFPE
9) SIGKILL10) SIGBUS11) SIGSEGV12) SIGSYS
13) SIGPIPE14) SIGALRM15) SIGTERM16) SIGURG
17) SIGSTOP1 SIGTSTP19) SIGCONT20) SIGCHLD
21) SIGTTIN22) SIGTTOU23) SIGIO24) SIGXCPU
25) SIGXFSZ26) SIGVTALRM27) SIGPROF2 SIGWINCH
29) SIGLOST30) SIGUSR131) SIGUSR2
大同小异。

论坛徽章:
0
发表于 2002-03-18 14:49 |显示全部楼层

shell 编程中的信号处理(signal handling in shell programming

受益匪浅

论坛徽章:
0
发表于 2002-03-18 15:24 |显示全部楼层

shell 编程中的信号处理(signal handling in shell programming

just learn it!admire u.

论坛徽章:
0
发表于 2002-03-20 09:53 |显示全部楼层

shell 编程中的信号处理(signal handling in shell programming

高级应用啊!!!
valentine , I 服了 YOU !!

论坛徽章:
0
发表于 2002-03-20 10:44 |显示全部楼层

shell 编程中的信号处理(signal handling in shell programming

It is really advanced skill.

论坛徽章:
0
发表于 2002-03-20 15:58 |显示全部楼层

shell 编程中的信号处理(signal handling in shell programming

大家喜欢便好。
也希望大家把自己的经验点滴写出来交流,让我们一切进步。

一天不学习,比不上刘少奇嘛。哈哈。

论坛徽章:
0
发表于 2002-03-28 22:19 |显示全部楼层

shell 编程中的信号处理(signal handling in shell programming

高呀。请教一个问题。
我做了这样一个SHELL:
trap "echo """ 2 3 4
echo "enter date"
reaed fdate
flen=`echo  $fdate|awi '{print $0}'`
if  [ $flen -ne 8 ]
:
:
这个SHELL 在某些机器上运行到 IF 语句时出错,提示:TEST 。。。
如果把TRAP语句屏蔽掉则可以在所有机器上正常运行。
这是怎么回事???

论坛徽章:
0
发表于 2002-03-29 09:17 |显示全部楼层

shell 编程中的信号处理(signal handling in shell programming

To fanyan1999 :
你的if 语句在用户输入为空是一般会出错的,应该在此以前有如此形式的判断
[ "X"$flen = "X" ] && echo "no input" && exit
你的trap语句是不是可以多换的形式试一试。
如:
trap “echo ‘’” 2 3 4

说明一下你用的系统和详细错误信息。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP