2.1.2 信号捕捉
这一节,我们从 基础知识、简单实践、小结 三个方面来学习。
基础知识
简介
shell编程提供了一种方式,让我们可以随意的控制脚本的运行状态,这就需要涉及到信号的捕获操作。在shell编程中,我们可以借助于 trap命令实现指定shell脚本要watch哪些linux信号并从shell中拦截。如果脚本收到了trap命令中列出的信号,它会阻止它被shell处理,而在本地处理。
trap命令格式
命令格式
trap commands signals
命令示例:
# 收到指定信号后,执行自定义指令,而不会执行原操作
trap '触发指令' 信号
# 忽略信号的操作
trap '' 信号
# 恢复原信号的操作
trap '-' 信号
# 列出自定义信号操作
trap -p
# 当脚本退出时,执行finish函数
trap finish EXIT
简单实践
实践1-捕获终止信号
查看脚本内容
[root@localhost ~]# cat signal_trap_test1.sh
#!/bin/bash
# 功能:脚本信号捕捉
# 捕获关闭信号
trap "你敢关我,就不关,气死你" SIGINT SIGTERM
trap "走了,不送" EXIT
# 检测逻辑效果
while true
do
read -p "请输入一个数据:" value
echo "您输入的数据是: ${value}"
done
脚本执行效果
[root@localhost ~]# /bin/bash signal_trap_test1.sh
请输入一个数据:4
您输入的数据是: 4
请输入一个数据:^Csignal_trap_test1.sh:行1: 你敢关我,就不关,气死你: 未找到命令
您输入的数据是:
请输入一个数据:^Z
[1]+ 已停止 /bin/bash signal_trap_test1.sh
[root@localhost ~]#
[root@localhost ~]# jobs
[1]+ 已停止 /bin/bash signal_trap_test1.sh
[root@localhost ~]# fg 1
/bin/bash signal_trap_test1.sh
您输入的数据是:
请输入一个数据:3
您输入的数据是: 3
另开一个终端,直接kill进程
[root@localhost ~]# ps aux | grep sign
root 39142 0.0 0.0 113288 1460 pts/0 S+ 17:43 0:00 /bin/bash signal_trap_test1.sh
[root@localhost ~]# kill -9 39142
回到之前的终端查看效果
[root@localhost ~]# fg 1
/bin/bash signal_trap_test1.sh
您输入的数据是:
请输入一个数据:3
您输入的数据是: 3
请输入一个数据:已杀死
实践2-捕获正常退出
查看脚本内容
[root@localhost ~]# cat signal_trap_test2.sh
#!/bin/bash
# 功能:脚本信号捕捉
# 捕获关闭信号
trap "echo '走了.不送'" EXIT
value="0"
# 检测逻辑效果
while true
do
read -p "请输入一个数据:" value
if [ ${value} == "9" ]
then
exit
else
echo "您输入的数据是: ${value}"
fi
done
脚本执行效果
[root@localhost ~]# /bin/bash signal_trap_test2.sh
请输入一个数据:3
您输入的数据是: 3
请输入一个数据:9
走了.不送
实践3-移除捕获
查看脚本内容
[root@localhost ~]# cat signal_trap_test3.sh
#!/bin/bash
# 功能:移除脚本信号捕捉
# 捕获关闭信号
trap "echo '走了.不送'" EXIT
i=1
# 检测逻辑效果
while [ $i -le 3 ]
do
read -p "请输入一个数据:" value
if [ ${value} == "9" ]
then
exit
else
echo "您输入的数据是: ${value}"
fi
let i+=1
done
# 移除捕获信号
trap - EXIT
echo "移除了捕获信号"
脚本执行效果
[root@localhost ~]# /bin/bash signal_trap_test3.sh
请输入一个数据:9
走了.不送
[root@localhost ~]# /bin/bash signal_trap_test3.sh
请输入一个数据:1
您输入的数据是: 1
请输入一个数据:2
您输入的数据是: 2
请输入一个数据:3
您输入的数据是: 3
移除了捕获信号
结果显示:
在没有走到信号捕获移除的时候,捕获仍然生效