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将无限休眠
)
View Code

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                #向父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
 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 信号继承的主要内容,如果未能解决你的问题,请参考以下文章

Linux Shell 信号

Linux的shell脚本trap信号处理

shell从入门到精通(10)信号捕获和处理

第九章 Shell信号发送与捕捉

Linux进程和任务管理

Linux 面试