Linux shell 信号继承
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux shell 信号继承相关的知识,希望对你有一定的参考价值。
shell中,向进程发送信号多多通过ctrl键加上一些功能键来实现,这里是常见的Ctrl组合键及其意义:
组合键 | 信号类型 | 意义 |
Ctrl+C | INT信号,即interrupt信号 | 停止运行当前的作业 |
Ctrl+Z | TSTP信号,即terminal stop信号 | 使当前作业暂时停止(转入阻塞状态) |
Ctrl+\ | QUIT信号 | Ctrl+C信号的强化版本,当Ctrl+C无法停止作业试,使用该组合键 |
Ctrl+Y | TSTP信号,即terminal stop信号 | 当进程从终端读取输入数据是,暂时停止该进程 |
子she‘ll能继承父she‘ll所忽略的信号,但是不能继承父she‘llwei未忽略的信号,我们举例来论证这一观点,创建两个脚本forever.sh和subsig.sh,forever.sh内容如下:
#forever.sh演示无限循环等待 #!/bin/bash while :; do #冒号相当于true. sleep 5 done
forever.sh脚本是提供subsig.sh脚本调用创建子shell的,功能就是无限循环,每次循环睡5秒,即forever.sh脚本永远不会停止,除非被kill命令杀掉。subsig.sh内容如下:
#!/bin/bash trap "" QUIT #忽略QUIT信号 trap "echo ‘You want to kill me‘" TERM #捕捉到TERM信号后打印提示信息 ( ./forever.sh #将forever.sh脚本作为子shell,子shell将无限休眠 )
subsig.sh使用了两次trap命令,将QUIT信号忽略,但是不忽略TERM信号,捕捉到TERM信号后,需要打印提示信息,然后利用圆括号建立子shell,下面是父子shell处理QUIT和TERM信号的测试过程:
[[email protected] shellScript]$ ./subsig.sh & #运行subsig.sh脚本 [1] 5118 #返回父shell作业号和进程号 [[email protected] shellScript]$ kill -3 5118 #向父she‘ll发送3号信号,即QUIT信号 [[email protected] shellScript]$ ps -a #父shell未退出,说明QUIT信号被忽略 PID TTY TIME CMD 3822 pts/0 00:00:00 su 3830 pts/0 00:00:00 bash 3868 pts/0 00:00:00 su 3869 pts/0 00:00:00 bash 4037 pts/0 00:00:00 vim 4038 pts/0 00:00:00 vim 4418 pts/0 00:00:00 traploop.sh 4499 pts/0 00:00:00 sleep 5118 pts/0 00:00:00 subsig.sh 5119 pts/0 00:00:00 forever.sh 5123 pts/0 00:00:00 sleep 5124 pts/0 00:00:00 ps [[email protected] shellScript]$ kill -3 5119 #向子shell发送3信号,即QUIT信号 [[email protected] shellScript]$ ps -a #子shell也未退出,说明QUIT信号也被忽略 PID TTY TIME CMD 3822 pts/0 00:00:00 su 3830 pts/0 00:00:00 bash 3868 pts/0 00:00:00 su 3869 pts/0 00:00:00 bash 4037 pts/0 00:00:00 vim 4038 pts/0 00:00:00 vim 4418 pts/0 00:00:00 traploop.sh 4499 pts/0 00:00:00 sleep 5118 pts/0 00:00:00 subsig.sh 5119 pts/0 00:00:00 forever.sh 5128 pts/0 00:00:00 sleep 5129 pts/0 00:00:00 ps [[email protected] shellScript]$ kill 5118 #向父shell发送TERM信号 [[email protected] shellScript]$ ps -a #父shell仍未被杀掉 PID TTY TIME CMD 3822 pts/0 00:00:00 su 3830 pts/0 00:00:00 bash 3868 pts/0 00:00:00 su 3869 pts/0 00:00:00 bash 4037 pts/0 00:00:00 vim 4038 pts/0 00:00:00 vim 4418 pts/0 00:00:00 traploop.sh 4499 pts/0 00:00:00 sleep 5118 pts/0 00:00:00 subsig.sh 5119 pts/0 00:00:00 forever.sh 5133 pts/0 00:00:00 sleep 5134 pts/0 00:00:00 ps [[email protected] shellScript]$ kill 5119 #向子shell发送TERM信号 [[email protected] shellScript]$ Terminated #子shell立刻被终止 You want to kill me! #并打印出父shell对TERM信号的相应信息 [1]+ Exit 143 ./subsig.sh #父shell随着子shell的终止而终止 [[email protected] shellScript]$
以上是关于Linux shell 信号继承的主要内容,如果未能解决你的问题,请参考以下文章