LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 176|回复: 0

信号处理

[复制链接]
发表于 2024-1-4 19:01:57 | 显示全部楼层 |阅读模式
信号处理
子shell
如何在shell脚本中启动一个子shell,语法为(command1,command2)将想要启动子shell的部分用圆括号括起来即可。子shell中的变量在子shell的代码块之外是不可见的,它们不能被传到启动这个子shell的shell(父进程),同样即使是全局变量,也不能在子shell里面进行更改。

捕获
要想使我们编写的脚本比较健壮,其中对于信号捕获处理的能力是需要考虑的,即当我们给执行中的脚本传递一个信号时,脚本能做出针对性的动作。

trap语句
bash的内部命令trap让我们可以在shell脚本内捕获特定的信号并对它们进行处理,其语法如下:

trap command signal [signal…]

其中command可以是函数或者脚本,signal即可以用信号名,也可以用信号值(比如9)指定。也可以不指定任何参数,而直接使用trap命令,将会打印每个要捕获的信号相关的命令的列表。下面通过例子来了解下


#使用mktemp命令创建一个临时文件:使用-u选项表示并不真正创建文件,只是打印生成的文件名,XXXXXX表示生成6位随机字符
[root@test ~]# FILE=`mktemp -u /tmp/testtrap.$$.XXXXXX`
[root@test ~]# echo $FILE
/tmp/testtrap.29566.3nnoUS
#定义捕获错误信号,这里是ERR
[root@test ~]# trap "some error" ERR
#查看已定义的捕获
[root@test ~]# trap
trap -- '' SIGTSTP
trap -- '' SIGTTIN
trap -- '' SIGTTOU
trap -- 'some error' ERR
#当我们删除不存在的文件时,会显示错误
[root@test ~]# rm $FILE
rm: cannot remove ‘/tmp/testtrap.29566.3nnoUS’: No such file or directory
some error
可以看到shell捕获到了我们定义的错误,并打印了相关信息

当调试比较大的脚本时,可能想要赋予某个变量一个踪迹属性,并捕获变量的调试信息,我们可以如下定义:


#声明变量variable,赋予其踪迹属性
declaer -t variable=value
#捕获DEBUG
trap "echo variable is being used" DEBUG
有时接收到一个信号后,可能不想对其做任何处理,可以使用空字符串(””或’’)作为trap的命令参数,那么shell将忽略这些信号,用法如下:

trap ‘ ‘ SIGHUP SIGINT [ signal … ]

关于SIGHUP SIGINT可以查看posix标准信号表。

移除捕获
如果我们在脚本中应用了捕获,我们通常会在脚本的结尾处,将收到信号时的行为处理重置为默认模式。重置(移除)捕获的语法如下:


trap - signal [signal...]

#比如上面的脚本,可以在结尾移除捕获
trap "echo variable is being used" DEBUG
trap - DEBUG

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表