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

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

相关文章

Nginx分布式部署流程分析

《Nginx分布式部署流程分析》文章介绍Nginx在分布式部署中的反向代理和负载均衡作用,用于分发请求、减轻服务器压力及解决session共享问题,涵盖配置方法、策略及Java项目应用,并提及分布式事... 目录分布式部署NginxJava中的代理代理分为正向代理和反向代理正向代理反向代理Nginx应用场景

Redis中的有序集合zset从使用到原理分析

《Redis中的有序集合zset从使用到原理分析》Redis有序集合(zset)是字符串与分值的有序映射,通过跳跃表和哈希表结合实现高效有序性管理,适用于排行榜、延迟队列等场景,其时间复杂度低,内存占... 目录开篇:排行榜背后的秘密一、zset的基本使用1.1 常用命令1.2 Java客户端示例二、zse

Redis中的AOF原理及分析

《Redis中的AOF原理及分析》Redis的AOF通过记录所有写操作命令实现持久化,支持always/everysec/no三种同步策略,重写机制优化文件体积,与RDB结合可平衡数据安全与恢复效率... 目录开篇:从日记本到AOF一、AOF的基本执行流程1. 命令执行与记录2. AOF重写机制二、AOF的

MyBatis Plus大数据量查询慢原因分析及解决

《MyBatisPlus大数据量查询慢原因分析及解决》大数据量查询慢常因全表扫描、分页不当、索引缺失、内存占用高及ORM开销,优化措施包括分页查询、流式读取、SQL优化、批处理、多数据源、结果集二次... 目录大数据量查询慢的常见原因优化方案高级方案配置调优监控与诊断总结大数据量查询慢的常见原因MyBAT

分析 Java Stream 的 peek使用实践与副作用处理方案

《分析JavaStream的peek使用实践与副作用处理方案》StreamAPI的peek操作是中间操作,用于观察元素但不终止流,其副作用风险包括线程安全、顺序混乱及性能问题,合理使用场景有限... 目录一、peek 操作的本质:有状态的中间操作二、副作用的定义与风险场景1. 并行流下的线程安全问题2. 顺

MyBatis/MyBatis-Plus同事务循环调用存储过程获取主键重复问题分析及解决

《MyBatis/MyBatis-Plus同事务循环调用存储过程获取主键重复问题分析及解决》MyBatis默认开启一级缓存,同一事务中循环调用查询方法时会重复使用缓存数据,导致获取的序列主键值均为1,... 目录问题原因解决办法如果是存储过程总结问题myBATis有如下代码获取序列作为主键IdMappe

Java中最全最基础的IO流概述和简介案例分析

《Java中最全最基础的IO流概述和简介案例分析》JavaIO流用于程序与外部设备的数据交互,分为字节流(InputStream/OutputStream)和字符流(Reader/Writer),处理... 目录IO流简介IO是什么应用场景IO流的分类流的超类类型字节文件流应用简介核心API文件输出流应用文

sysmain服务可以禁用吗? 电脑sysmain服务关闭后的影响与操作指南

《sysmain服务可以禁用吗?电脑sysmain服务关闭后的影响与操作指南》在Windows系统中,SysMain服务(原名Superfetch)作为一个旨在提升系统性能的关键组件,一直备受用户关... 在使用 Windows 系统时,有时候真有点像在「开盲盒」。全新安装系统后的「默认设置」,往往并不尽编

Android 缓存日志Logcat导出与分析最佳实践

《Android缓存日志Logcat导出与分析最佳实践》本文全面介绍AndroidLogcat缓存日志的导出与分析方法,涵盖按进程、缓冲区类型及日志级别过滤,自动化工具使用,常见问题解决方案和最佳实... 目录android 缓存日志(Logcat)导出与分析全攻略为什么要导出缓存日志?按需过滤导出1. 按

Linux中的HTTPS协议原理分析

《Linux中的HTTPS协议原理分析》文章解释了HTTPS的必要性:HTTP明文传输易被篡改和劫持,HTTPS通过非对称加密协商对称密钥、CA证书认证和混合加密机制,有效防范中间人攻击,保障通信安全... 目录一、什么是加密和解密?二、为什么需要加密?三、常见的加密方式3.1 对称加密3.2非对称加密四、