zoukankan      html  css  js  c++  java
  • 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信号的测试过程:

    [wandl@TestMachine2 shellScript]$ ./subsig.sh &             #运行subsig.sh脚本
    [1] 5118                                                                       #返回父shell作业号和进程号
    [wandl@TestMachine2 shellScript]$ kill -3 5118                #向父she'll发送3号信号,即QUIT信号
    [wandl@TestMachine2 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
    [wandl@TestMachine2 shellScript]$ kill -3 5119           #向子shell发送3信号,即QUIT信号
    [wandl@TestMachine2 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
    [wandl@TestMachine2 shellScript]$ kill 5118             #向父shell发送TERM信号
    [wandl@TestMachine2 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
    [wandl@TestMachine2 shellScript]$ kill 5119           #向子shell发送TERM信号
    [wandl@TestMachine2 shellScript]$ Terminated       #子shell立刻被终止
    You want to kill me!                                               #并打印出父shell对TERM信号的相应信息
    
    [1]+  Exit 143                ./subsig.sh                       #父shell随着子shell的终止而终止
    [wandl@TestMachine2 shellScript]$ 
  • 相关阅读:
    JMeter网站测试分析
    JMeter元件的作用域和执行顺序
    JMeter脚本录制
    认识Jmeter工具
    Fiddler 只取所需
    Fiddler设置代理(PC和Android)
    Fiddler获取https会话
    Fiddler 你需要了解的
    关于excel的导入导出
    第十章、random模块
  • 原文地址:https://www.cnblogs.com/nurruden/p/6796395.html
Copyright © 2011-2022 走看看