上一节中用了 C 语言来理解信号的处理, 那么在 bash 中是如何理解的呢?
首先我们来认识一下 trap 命令 #type trap
o_o 原来是一个 shell 的内建命令, 大家能想想为何是内建命令吗?
sh 是人机对话的接口, 我们发起的命令都会通过 sh 与内核进行打交道, 那么在当前 sh 进程内就能及时完成信号的捕捉和处理
好了我们回到 bash 中如何理解呢? 我们还是用回上一节的实例来做, 创建一个 signalshell.sh 文件, 文件内容如下:
- #!/bin/bash
- #
- echo "Process ID is $$" #$$ 获取当前进程的 ID, 可看到笔者的 sh 变量特性 (3) 默认特性
- #trap 的使用格式 trap command;command signal
- trap echo "Get a singal -- SIGHUP" SIGHUP
- trap echo "Get a singal -- SIGINT" SIGINT
- trap echo "Get a singal -- SIGQUIT" SIGQUIT
- # 写个死循环来让进程一直运行, 以便捕捉信号
- while true
- do
- sleep 1
- done
保存文档, 并添加可执行权限
#chmod u+x signalshell.sh
执行一下 #./signalshell.sh
同样想要杀死进程, 按 ctrl+c 已经是不行了, 只能发送第 9 信号, 上去就一刀把进程杀死, 不给喘气的机会 ^_^
题外扩展一下: 如果写个循环脚本来 ping 某个网段, 当按下 ctrl+c 的时候, 并不会退出当前进程, 而是退出了当前 ping, 还会循环继续 ping 下一个 ip 那么写脚本可以让用户按下 ctrl+c 的时候就可以退出脚本, 而不继续 ping 呢?
来源: http://www.bubuko.com/infodetail-2517072.html