5信号处理
信号就是系统向脚本或命令发出的消息,告知它们某个事件的发生。这些事件通常是内存错误,访问权限问题或某个用户试图停止你的进程。信号实际上是一些数字。下表列出了最常用的信号及它们的含义列出所有信号:
>kill –l
HUP INT QUIT ILL TRAP IOT EMT FPE KILL BUS SEGV SYS PIPE ALRM TERM USR1
USR2 CLD PWR VTALRM PROF IO WINCH STOP TSTP CONT TTIN TTOU
一些信号的含义:
1 SIGHUP 挂起或父进程被杀死
2 SIGINT 来自键盘的中断信号,通常是< C T R L - C >
3 SIGQUIT 从键盘退出
9 SIGKILL 无条件终止
11 SIGSEGV 段(内存)冲突
15 SIGTERM 软件终止(缺省杀进程信号)
5.1 发出信号:
kill –信号 进程号
注明:kill –9 进程号 杀死进程时,操作系统直接将进程从内核清除,不作退出的处理
5.2 检测信号或者捕捉信号
有些信号可以被应用程序或脚本捕获,并依据该信号采取相应的行动。另外一些信号不
能被捕获。例如,如果一个命令收到了信号9,就无法再捕捉其他信号。
当脚本捕捉到一个信号后,它可能会采取下面三种操作之一:
1) 不采取任何行动,由系统来进行处理。
2) 捕获该信号,但忽略它。
3) 捕获该信号,并采取相应的行动
如果需要捕捉信号后,采用自定义的操作,可以使用trap命令:
trap name signal(s)
其中,name是捕捉到信号以后所采取的一系列操作。实际生活中, name一般是一个专门用来处理所捕捉信号的函数。Name需要用双引号(“ ”)引起来。Signal就是待捕捉的信号。
下表列出了一些最常见的trap命令用法:
trap "" 2 3 忽略信号2和信号3,用户不能终止该脚本
trap"commands" 2 3 如果捕捉到信号2或3,就执行相应的commands命令
trap 2 3 复位信号2和3,用户可以终止该脚本
如:收到3( SIGQUIT 从键盘退出),打印一行“proc received SIGQUIT and exit”
#!/bin/ksh
trap “fun_exit” 3
fun_exit()
{
echo “proc received SIGQUIT and exit”
exit 1
}
echo “start running”
exit 0
6 eval命令
eval命名可以执行之后跟随的命令或者变量所赋的值或者表达式。比如:
用法1:
eval echo “aaa”
用法2:
command=env
eval $env
command=”echo aaa”
eval $command
用法3:
value=0
eval [ $? -gt $value ]&&j=1
eval [ $? -gt $value ]&& echo “successfully”
eval var=$#
eval命令在执行程序运行过程中赋值命令的变量非常有用。比如在SHELL编制的人机交互界面中,选中某个菜单项后执行没个命令或者函数,脚本本身不可能为每个菜单项case一遍。
【4】其他
4.1 使用不同的壳执行命令文件
1) 如果Script的第一个非空白字元不是"#",则它会使用Bourne Shell。
2) 如果Script的第一个非空白字元是"#"时,但不以"#!"开头时,则它会使用C Shell。
3)如果Script以"#!"开头,则"#!"後面所写的就是所使用的Shell,而且要将整个路径名称指出来,这里建议使用第三种方式指定Shell ,以确保所执行的就是所要的。Bourne Shell的路径名称为/bin/sh ,而C Shell 则为/bin/csh。我们一般使用ksh, 路径为/bin/ksh
4.2 使用不同SHELL的区别
BSH:
设置环境变量使用export var=var_value; var=var_valu; export var
CSH/KSH:
设置环境变量使用setenv var var_value
一些KSH独有的特征:
1)KSH环境变量
HISTSIZE:历史命令数量,默认为128,可以在.chsrc中将其设置为其他值
TMOUT :超时自动退出,用于一段时间没有键入命令,强制退出
1) 别名
可以定义自己的标识,标识定义的命令。比如:
alias dba dbaccess $TELLIN_DBNAME
2) 支持数组变量
4.3 SHELL程序的返回值不能超出255,否则返回值将不确定
4.4 read命令将输入的多余的part给最后一个变量
>read var1 var2
aa bb cc
>echo $var1
aa
>echo $var2
bb cc
4.5 调试
使用-x
1) 在SHELL程序指定执行为调试模式
#!/bin/sh –x
2) 在命令行中指定调试模式执行
指定SHELL –x 程序名称,如:
sh –x update_iuser214.sh
4.6 执行SHELL
前台执行:
>sh 程序名称
>程序名称
后台执行:
>sh 程序名称 &
>程序名称 &
4.7 移植性
目前智能业务部的设备选型中,小型机从IBM/HP/SUN 3家中选择。相应我们的SHELL一般需要在AIX,HP-UX,SunOS上应当保持一致。即SHELL程序一般需要在3中操作系统上进行移植。
可以使用uname –s确定机器的操作系统,比如:
#机器类型
OsType=`uname -s`
if [ "-$OsType" = "-SunOS" ]; then
…
elif [ "-$OsType" = "-HP-UX" ]; then
…
elif [ "-$OsType" = "-AIX" ]; then
…
else
echo "ERROR: system not support this machine type $OsType"
eixt 1
fi
大部分常见的UNIX命令在以上3中操作是一致的,但是某些命令则具有差异(如ftp的ls在HP-UX为nlist)。如果碰到与操作系统相关的地方,则需要根据操作系统作相应处理。
附录:
一个SHELL编制的人机交互界面,里面使用的SHELL语法比较深入。如果能读懂或者编制同样程序,则表明你的SHELL教本功底已经足够深厚。如果不能读懂,可以挑战一下自己。