小庄往左走

在有些情况下,我们不希望自己的shell脚本在运行时刻被中断,比如说我们写得shell脚 本设为某一用户的默认shell,,使这一用户进入系统后只能作某一项工作,如数据库备份, 我 们可不希望用户使用ctrl+C之类便进入到shell状态,做我们不希望做的事情。这便用到了信号 处理。 kill -l可以列出系统的信号名称,如下: zj@zj:~/Script/test$ kill -l1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE9) SIGKILL 10) SIGUSR1 11) SIGSEGV 12) SIGUSR213) SIGPIPE 14) SIGALRM 15) SIGTERM 16) SIGSTKFLT17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU25) SIGXFSZ 26) SIGVTALRM 27) SIGPROF 28) SIGWINCH29) SIGIO 30) SIGPWR 31) SIGSYS 34) SIGRTMIN35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3 38) SIGRTMIN+439) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+843) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+1247) SIGRTMIN+13 48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-1451) SIGRTMAX-13 52) SIGRTMAX-12 53) SIGRTMAX-11 54) SIGRTMAX-1055) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7 58) SIGRTMAX-659) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-263) SIGRTMAX-1 64) SIGRTMAX 通常我们需要忽略的信号有四个,即:HUP, INT, QUIT, TSTP,也就是信号1, 2, 3, 24 使用这样的语句可以使这些中断信号被忽略: trap “” 1 2 3 24 或 trap “” HUP INT QUIT TSTP 用 trap :1 2 3 24 或 trap HUP INT QUIT TSTP使其回复默认值。 用stty -a可以列出中断信号与键盘的对应,分别执行上面的命令后,运行 tail -f /etc/passwd, 然后尝试用键盘中断,试试两种情况(默认和忽略)下有何不同。

zj@zj:~/Script/test$ stty -aspeed 38400 baud; rows 24; columns 80; line = 0;intr = ^C; quit = ^/; erase = ^?; kill = ^U; eof = ^D; eol = M-^?; eol2 = M-^?;swtch = M-^?; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W;lnext = ^V; flush = ^O; min = 1; time = 0;-parenb -parodd cs8 hupcl -cstopb cread -clocal -crtscts-ignbrk brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl ixon -ixoff-iuclc ixany imaxbel iutf8opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0isig icanon iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprtechoctl echoke

更方便的是我们可以用在shell中用trap定义我们自己的信号处理程序,就象在c中用 signal一样, 如:trap “echo ‘GO Away’” INT

eg:

zj@zj:~/Script/test$ cat reboot.sh

#/bin/bash

i=0;while(( 1 ))doecho “hello $i”sleep 1(( i++ ))echo $$echo $0trap “bash $0 && kill $$” QUIT##!trap “bash $0 && kill $$” 1doneecho haha

常用系统变量:

$1 ~ $9 命令行上的第一到第九个参数

$# 命令行上的参数个数

$* 命令行上的所有参数

$@ 分别用双引号引用命令行上的所有参数

$? 上一条命令的退出状态

$! 最后一个后台进程的进程标识号

系统变量只能引用不能修改!

zj@zj:~/Script/test$ ./reboot.sh hello 020562trap.shhello 120562trap.shhello 2Quithello 020562trap.shhello 120562trap.shhello 2Quit这样^/就可以reboot程序了^_^不知道linux重启是不是trap到某个信号了就这样…当然是类似,这个脚本太east了.有时间加机会了看看^_^

附:

你必须百分之百的把自己推销给自己。

小庄往左走

相关文章:

你感兴趣的文章:

标签云: