第二十三天:trap


在有些状况下,咱们不但愿本身的shell脚本在运行时刻被中断,好比说咱们写得shell脚 
本设为某一用户的默认shell,使这一用户进入系统后只能做某一项工做,如数据库备份, 我 
们可不但愿用户使用ctrl+C之类便进入到shell状态,作咱们不但愿作的事情。这便用到了信号 
处理。 
kill -l能够列出系统的信号名称
一般咱们须要忽略的信号有四个,即: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, 而后尝试用键盘中断,试试两种状况(默认和忽略)下有何不一样。 

 

经常使用系统变量: shell

$0           当前shell程序的名字 数据库

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

$#           命令行上的参数个数 spa

$*           命令行上的全部参数 命令行

$@         分别用双引号引用命令行上的全部参数 code

$$           当前进程的进程标识号(PID) 进程

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

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

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

trap命令用于指定在接收到信号后将要采起的行动,trap命令的参数分为两部分,前一部分是接收到指定信号时将要采起的行动,后一部分是要处理的信号名.

信     号 it

说     明

HUP(1)

挂起,一般因终端掉线或用户退出而引起

INT(2)

中断,一般因按下Ctrl+C组合键而引起

QUIT(3)

退出,一般因按下Ctrl+\组合键而引起

ABRT(6)

停止,一般因某些严重的执行错误而引起

ALRM(14)

报警,一般用来处理超时

TERM(15)

终止,一般在系统关机时发送


一. trap捕捉到信号以后,能够有三种反应方式:

  1. 执行一段程序来处理这一信号
  2. 接受信号的默认操做
  3. 忽视这一信号

二. trap对上面三种方式提供了三种基本形式:
第一种形式的trap命令在shell接收到signal list清单中数值相同的信号时,将执行双
引号中的命令串:
trap 'commands' signal-list
trap "commands" signal-list

第二种形式的trap命令,为了恢复信号的默认操做:
trap signal-list

第三种形式的trap命令容许忽视信号:
trap " " signal-list

在第一种形式中,执行命令,对于双引号和单引号是有区别的。

#/bin/bash

#忽略信号
#trap " " 2

#双引号,shell第一次设置信号的时候就执行命令和变量的替换,时间不变 trap "echo `date`:can not terminate by ctrl+C" 2                

#单引号,要在shell探测到信号来的时候才执行命令和变量的替换,时间一直变 trap 'echo `date`:can not terminate by ctrl+C' 2                

while [ 1 ]
do
        echo -n "input a num : "
        read num 
        if [ $num -eq -1 ]
        then
                echo "bye"
                break
        fi
        echo "you have enter $num"
done
相关文章
相关标签/搜索