美文网首页Shell 脚本成长笔记
信号(三):Bash 中的信号

信号(三):Bash 中的信号

作者: 赵者也 | 来源:发表于2017-05-22 20:46 被阅读3次

    当没有任何捕获时,一个交互式 Bash Shell 会忽略 SIGTERM 和 SIGQUIT 信号。由 Bash 运行的非内部命令会使用 Shell 从其父进程继承的信号处理程序。如果没有启用作业控制,异步执行的命令会忽略除了有这些信号处理程序之外的 SIGINT 和 SIGQUIT 信号。由于命令替换而运行的命令会忽略键盘产生的作业控制信号 SIGTTIN、SIGTTOU 和 SIGTSTP。

    默认情况下,Shell 接收到 SIGHUP 信号后会退出。在退出之前,一个交互式的 Shell 会向所有的作业,不管是正在运行的还是已停止的,重新发送 SIGHUP 信号。对已停止的作业,Shell 还会发送 SIGCONT 信号以确保它能够接收到 SIGHUP 信号。若要阻止 Shell 向某个特定的作业发送 SIGHUP 信号,可以使用内部 disown 将它从作业表中移除,或是用 “disown -h” 命令阻止 Shell 向特定的作业发送 SIGHUP 信号,但并不会将特定的作业从作业表中移除。我们通过如下实例,来了解一下 disown 命令的作用:

    # 将 sleep 命令放在后台执行,休眠 30 秒
    sleep 30 &
    
    # 列出当前 Shell 下所有作业的信息
    jobs -l
    
    # 将作业 1 从作业表中移除
    disown %1
    
    # 再次列出当前 Shell 下所有作业的信息
    jobs -l
    
    # 查找 sleep 进程
    ps -ef | grep sleep
    
    # 打印当前 Shell 的进程号
    echo $$
    

    运行结果:

    运行结果

    在上述实例中,虽然作业表中已经没有了作业,但是进程依然存在。此时,Shell 若收到 SIGHUP 信号,它就不会向作业 1 重写发送 SIGHUP 信号,此时如果我们退出 Shell,这个作业仍将继续运行,而不会被终止。

    本文参考自 《Linux Shell命令行及脚本编程实例详解

    相关文章

      网友评论

        本文标题:信号(三):Bash 中的信号

        本文链接:https://www.haomeiwen.com/subject/toeixxtx.html