关闭终端后,后台作业退出的分析

2024-05-07 11:08

本文主要是介绍关闭终端后,后台作业退出的分析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

先把结论写在上面:

-- 内核驱动发现终端(或伪终端)关闭,给对应终端的控制进程(bash)发 SIGHUP 
-- bash收到SIGHUP后,会给各个作业(包括前后台)发送SIGHUP,然后自己退出
-- 前后台的各个任务,收到来自 bash 的SIGHUP,退出(如果程序会处理SIGHUP,就不会退出)

PS: 这里所谓终端关闭就是指内核感知不到终端了,远程登录时的网络断开、sshd挂掉之类的情况也算在内。

PPS: SIGHUP会在以下情况发出

1、终端关闭时,该信号被内核发送到session首进程

2、session首进程退出时,该信号被内核发送到该session中的前台进程组中的每一个进程

3、若父进程退出导致进程组成为孤儿进程组,且该进程组中有进程处于停止状态(收到SIGSTOP或SIGTSTP信号),该信号会被发送到该进程组中的每一个进程。

PPPS: bash 收到SIGHUP后会转发给各个任务(job)





下面是”纠结“的分析过程:


现象:./a.out & 这种方式运行,关闭终端后,a.out也会终止


分析:

首先,写了个简单的脚本看是什么信号导致的后台作业退出。

a.pl:

#! /usr/bin/perl -w


$SIG{HUP} = sub{print "HUP/n"};

$SIG{KILL} = sub{print "KILL/n"};

$SIG{TERM} = sub{print "TERM/n"};


while (1){

    sleep 1;

}


运行a.pl: ./a.pl > log.txt &;关闭终端;在另一个终端查看log.txt,内容为HUP,且a.pl仍然存活

结论:是SIGHUP信号导致后台作业退出


然后,查看SIGHUP从哪里来,google + baidu,搜索到最多的那个(就是来回转载的,中文技术资料的冗余程度,你懂的!)

SIGHUP会在以下3种情况下被发送给相应的进程:

1、终端关闭时,该信号被发送到session首进程以及作为job提交的进程(即用 & 符号提交的进程)

2、session首进程退出时,该信号被发送到该session中的前台进程组中的每一个进程

3、若父进程退出导致进程组成为孤儿进程组,且该进程组中有进程处于停止状态(收到SIGSTOP或SIGTSTP信号),该信号会被发送到该进程组中的每一个进程。


       到这一步,放佛已经很明了,终端或者伪终端关闭后,SIGHUP会发给“作为job提交的进程”。

       然而我恰好犯贱,想多浪费一些时间,又翻看了一下《Unix环境高级编程》,发现其实上面标粉红的那一部分貌似是主观意见而已。但是作为job提交的 a.pl 确实收到了一个SIGHUP,是谁在什么情形下偷偷发出的呢?

       于是上CSND求牛人作答:http://topic.csdn.net/u/20110402/23/0eebdafa-c2c1-4ed5-b981-365f80bb6e7f.html

       鉴于回答热度不高,无奈又上stackoverflow问了一下:http://stackoverflow.com/questions/5527405/where-is-sighup-from-sshd-forks-a-child-to-create-a-new-session-kill-this-chil

       stackoverflow上的回答还算有些靠谱,自己仿佛觉得,mm,这个SIGHUP来自内核的driver。


继续验证 a.pl 收到的确来自内核driver,而不是相干的进程(如父进程bash)

又去查看bash的手册,终于看到

The shell exits by default upon receipt of a SIGHUPBefore exiting, an interactive shell resends the SIGHUP to all jobs, running or stopped. Stopped jobs are sent SIGCONT to ensure that they receive the SIGHUP.

真相接近大白:原来是bash在收到内核driver发出的SIGHUP后,转发给 a.pl 的 !

欣喜之余,跑到csdn自己提问的那个链接匆忙结贴。




待续:

使用trap命令,运行

i=-1;while((++i<33)); do trap "echo $i >> log.txt" $i; done

强行关闭终端,log.txt的内容为

1
18
1
17
0

bash竟然收到这么多信号... 还是我trap用的有问题,为什么bash会收到这些信号呢?

http://topic.csdn.net/u/20110405/09/8f20f0dc-492a-4c3b-bd36-eb8c6f9ff482.html



来源:http://www.flatws.cn/article/program/perl/2011-04-06/19454.html


这篇关于关闭终端后,后台作业退出的分析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/967175

相关文章

MyBatis-Plus中Service接口的lambdaUpdate用法及实例分析

《MyBatis-Plus中Service接口的lambdaUpdate用法及实例分析》本文将详细讲解MyBatis-Plus中的lambdaUpdate用法,并提供丰富的案例来帮助读者更好地理解和应... 目录深入探索MyBATis-Plus中Service接口的lambdaUpdate用法及示例案例背景

MyBatis-Plus中静态工具Db的多种用法及实例分析

《MyBatis-Plus中静态工具Db的多种用法及实例分析》本文将详细讲解MyBatis-Plus中静态工具Db的各种用法,并结合具体案例进行演示和说明,具有很好的参考价值,希望对大家有所帮助,如有... 目录MyBATis-Plus中静态工具Db的多种用法及实例案例背景使用静态工具Db进行数据库操作插入

如何关闭 Mac 触发角功能或设置修饰键? mac电脑防止误触设置技巧

《如何关闭Mac触发角功能或设置修饰键?mac电脑防止误触设置技巧》从Windows换到iOS大半年来,触发角是我觉得值得吹爆的MacBook效率神器,成为一大说服理由,下面我们就来看看mac电... MAC 的「触发角」功能虽然提高了效率,但过于灵敏也让不少用户感到头疼。特别是在关键时刻,一不小心就可能触

Go使用pprof进行CPU,内存和阻塞情况分析

《Go使用pprof进行CPU,内存和阻塞情况分析》Go语言提供了强大的pprof工具,用于分析CPU、内存、Goroutine阻塞等性能问题,帮助开发者优化程序,提高运行效率,下面我们就来深入了解下... 目录1. pprof 介绍2. 快速上手:启用 pprof3. CPU Profiling:分析 C

MySQL表锁、页面锁和行锁的作用及其优缺点对比分析

《MySQL表锁、页面锁和行锁的作用及其优缺点对比分析》MySQL中的表锁、页面锁和行锁各有特点,适用于不同的场景,表锁锁定整个表,适用于批量操作和MyISAM存储引擎,页面锁锁定数据页,适用于旧版本... 目录1. 表锁(Table Lock)2. 页面锁(Page Lock)3. 行锁(Row Lock

Springboot中分析SQL性能的两种方式详解

《Springboot中分析SQL性能的两种方式详解》文章介绍了SQL性能分析的两种方式:MyBatis-Plus性能分析插件和p6spy框架,MyBatis-Plus插件配置简单,适用于开发和测试环... 目录SQL性能分析的两种方式:功能介绍实现方式:实现步骤:SQL性能分析的两种方式:功能介绍记录

最长公共子序列问题的深度分析与Java实现方式

《最长公共子序列问题的深度分析与Java实现方式》本文详细介绍了最长公共子序列(LCS)问题,包括其概念、暴力解法、动态规划解法,并提供了Java代码实现,暴力解法虽然简单,但在大数据处理中效率较低,... 目录最长公共子序列问题概述问题理解与示例分析暴力解法思路与示例代码动态规划解法DP 表的构建与意义动

C#使用DeepSeek API实现自然语言处理,文本分类和情感分析

《C#使用DeepSeekAPI实现自然语言处理,文本分类和情感分析》在C#中使用DeepSeekAPI可以实现多种功能,例如自然语言处理、文本分类、情感分析等,本文主要为大家介绍了具体实现步骤,... 目录准备工作文本生成文本分类问答系统代码生成翻译功能文本摘要文本校对图像描述生成总结在C#中使用Deep

怎么关闭Ubuntu无人值守升级? Ubuntu禁止自动更新的技巧

《怎么关闭Ubuntu无人值守升级?Ubuntu禁止自动更新的技巧》UbuntuLinux系统禁止自动更新的时候,提示“无人值守升级在关机期间,请不要关闭计算机进程”,该怎么解决这个问题?详细请看... 本教程教你如何处理无人值守的升级,即 Ubuntu linux 的自动系统更新。来源:https://

Redis主从/哨兵机制原理分析

《Redis主从/哨兵机制原理分析》本文介绍了Redis的主从复制和哨兵机制,主从复制实现了数据的热备份和负载均衡,而哨兵机制可以监控Redis集群,实现自动故障转移,哨兵机制通过监控、下线、选举和故... 目录一、主从复制1.1 什么是主从复制1.2 主从复制的作用1.3 主从复制原理1.3.1 全量复制