shell直接退出后 后台进程关闭的原因和对处
在linux上进行测试时发现启动后台进程后,如果使用exit退出登录shell,shell退出后后台进程还是能够正常运行,但如果直接关闭登陆的窗口(如直接关掉xshell),那后台进程就会一起终了。都是退出登录为什么前者后台进程会退出,而后者不会退出呢?
在查看bash的manual时发现有如下一段描述:
The shell exits by default upon receipt of a SIGHUP. Before 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.
由此可以知道后台进程退出是由于登陆shell收到了SIGHUP信号后在退出前将SIGHUP转发给所有的作业(jobs)。jobs由于收到SIGHUP而终止运行。
那能不能通过设置,在窗口异常关闭时保持后台进程继续运行呢?
答案是肯定的,一般有如下4种方法:
(在此声明,推荐使用exit退出,以下方法不一定管用,网上找的方法,未测试;第一种方法可能对一些进程有效,一些无效吧,至少我测试过,elasticsearch的kibana进程,nohup是无法阻止SIGHUP信号的)
1. 使用nohup运行命令
# nohup ./back.sh & # nohup ./fore.sh ^Z [2]+ Stopped nohup ./fore.sh # jobs [1]- Running nohup ./back.sh & [2]+ Stopped nohup ./fore.sh # ps -o pid,ppid,pgid,sid,cmdPID PPID PGID SID CMD4766 4716 4766 4716 /bin/bash ./back.sh4769 4716 4769 4716 /bin/bash ./fore.sh # fg nohup ./fore.sh### 关闭窗口并重新登录 #### ps -eo pid,paid,pgid,sid,cmd |grep -E "back|fore"4766 1 4766 4716 /bin/bash ./back.sh4769 1 4769 4716 /bin/bash ./fore.sh
发现重新登录后前台和后台进程都还运行着但父进程变成了init。
值得注意的是nohup会在当前目录下产生一个nohup.out文件,并把实际命令的标准输出和标准错误重定向为nohup.out
2. 使用setsid运行命令
# setsid ./back.sh & # setsid ./fore.sh # jobs # ps -eo pid,ppid,pgid,sid,cmd |grep -E "back|fore"4871 1 4871 4871 /bin/bash ./back.sh4874 1 4874 4874 /bin/bash ./fore.sh### 关闭窗口并重新登录 #### ps -eo pid,ppid,pgid,sid,cmd |grep -E "back|fore"4871 1 4871 4871 /bin/bash ./back.sh4874 1 4874 4874 /bin/bash ./fore.sh
可以发现在使用setsid后,不能在当前登录shell的jobs中找到back.sh和fore.sh。并且由于在退出前back.sh和fore.sh的父进程已经是init,重新登录后back.sh和fore.sh没有发生任何改变。
3. 使用disown命令
# ./fore.sh ^Z [2]+ Stopped # jobs [1]- Running ./back.sh & [2]+ Stopped ./fore.sh # ps -eo pid,ppid,pgid,sid,cmd |grep -E "back|fore"5395 5361 5395 5361 /bin/bash ./back.sh5396 5361 5396 5361 /bin/bash ./fore.sh # disown -h %2 # disown -a %1 # jobs [2]+ Stopped ./fore.sh # fg ./fore.sh### 关闭窗口并重新登录 #### ps -eo pid,ppid,pgid,sid,cmd |grep -E "back|fore"5395 5361 5395 5361 /bin/bash ./back.sh
重新登录后发现fore.sh还是被终止了,并且经过调查发现终了的原因是收到了SIGHUP信号。由此可见disown仅对后台进程起作用。
4. Catch SIGHUP信号
如果是shell脚本,则在脚本中加上下面的一条语句就行了。
# trap "" HUP
如果是C程序,则使用signal函数对SIGHUP进行屏蔽就行了。
signal(SIGHUP, SIG_IGN);
X. 当然相反的我们也可以让shell在exit退出时发送SIGHUP给所有的jobs,具体设置如下:
# shopt -s huponexit
shell直接退出后 后台进程关闭的原因和对处相关推荐
- php网站后台无法退出,zblog“网站关闭”后进入不了后台的解决方法
zblog后台网站设置--全局设置里面有个"关闭网站"功能,这个功能是给一些有临时关站的用户使用的.我也不知道为什么有一些人要关闭?可能没时间管理吧... 打开这个开关后,网站首页 ...
- nohup xxx 后台进程关闭,可以这样避免
nohup xxx &后台进程关闭,可以这样避免 1.nohup 是 no hang up 的缩写,就是不挂断的意思,但没有后台运行,终端不能标准输入. 加一个nohup命令在最前面,表示不挂 ...
- 【初识太极】CAD异常退出后如何恢复备份文件?
只要使用过一段时间CAD的,不管你用的是AUTOCAD,还是浩辰CAD,很少有没遇到过软件异常退出的.异常退出的原因有很多,有的是软件的BUG,有的是图中有错误数据,或者系统软件和硬件出现了问题,如断 ...
- 进程退出后占用的内存都去哪儿了?
本文是<深入理解操作系统>第四章,从本章开始将开启第一个重要的主题:进程,彻底理解进程对程序员来说是极为重要的,本章就从程序员的角度来讲解到底什么是进程.操作系统是如何实现进程的.本文承接 ...
- Linux shell脚本执行后出现语法错误: 未预期的文件结尾
Windows环境下编写了一个shell脚本,上传到Linux环境中执行,Linux shell脚本执行后出现 语法错误: 未预期的文件结尾. 出现了此错误提示,进行了如下的检查:1.检查Shell脚 ...
- C#应用程序退出后托盘图标(notify…
很多时候,在我们的应用程序执行Application.Exit()退出后,我们设置的状态栏托盘图标都不会立即消失,当鼠标光标划过时才会消失.这是因为托盘图标的资源还没来得及释放造成的,要想解决这个问题 ...
- 解决 IDEA2022 push远程时取消analyze code后,退出后自动复原
问题描述: 项目很大,修改的代码太多,提交的时候analyze code很久,按照帖子: idea提交代码时关闭代码分析_Java码农老王的博客-CSDN博客_idea关闭代码分析 设置了取消anal ...
- 远程桌面连接后远程计算机注销,windows2003远程桌面退出后系统自动注销的问题...
问题现象: 最近在windows2003 r2下设置了定时任务,需要一定时间把数据从一个目录拷贝到另外的目录.结果出现很奇怪的问题: 1.手动执行批处理无问题. 2.定时后,用户退出后的一定时间内,执 ...
- linux nohup命令启动程序,关闭shell,程序依然会关闭
linux nohup命令启动程序,关闭shell,程序依然会关闭 解决办法 执行完nohup命令之后,使用exit命令退出shell登录 > nohup ./aaa & > ex ...
- 快播退出后网络任务无法继续下载怎么办呢
有没有发现有时候快播退出后网络任务全部消失不能继续下载,这是怎么一回事? 可能是开启了具有清理功能的软件,关闭此类软件后再点播试试.如果没有开启此类软件,请将QvodPlayer文件夹中的playli ...
最新文章
- 机械毕业本科生竟被嵌入式单片机公司录取?
- AngularJS 实现的输入自动完成补充功能
- 算法与数据结构--数组和链表的区别
- 自定义Dictionary支持线程安全
- SAP用户权限控制大解析及权限进阶分析
- c++ vector 赋值_C++中vector用法
- Kickstart+NFS+DHCP+TFTP+PXElinux实现CentOS的网络自动安装
- 信息竞赛进阶指南--单调队列模板
- PTA 程序设计天梯赛(21~40题)
- MAMP Pro for Mac(PHP/MySQL开发环境)v6.6
- 企业API接口设计(token、timestamp、sign)之具体实现
- 深度操作系统 V15.11——心随意动 畅享云端
- 国内服务器免备案教程 可使用80端口进入后台
- React的消息订阅全过程
- 2022-01-24:K 距离间隔重排字符串。 给你一个非空的字符串 s 和一个整数 k,你要将这个字符串中的字母进行重新排列,使得重排后的字符串中相同字母的位置间隔距离至少为 k。 所有输入的字符串
- CANOPEN 协议 命令字
- Python Scrapy 爬虫 - 爬取多级别的页面
- 寄存器英文全称中文翻译英文对照表
- python 在指定位置显示图片并调整窗口大小(或图片大小)
- 干饭篇-西红柿炒鸡蛋+银耳红枣粥
热门文章
- 网络操控软件兴起:思科利润率受压
- 如何隐藏UITabBar 已经如何使已经隐藏的TabBar重现(原创)
- DPDK收发包全景分析
- Performance Engineering of Software Systems (一)——准备工作
- deadline调度器之(一):原理
- android 看门狗引起crash分析
- uboot 使用fdt命令查看设备树
- 51Nod 1637	幸运数字转换(思维)
- 201约花鸟画 考c语言试题,全国计算机二级C语言上机100题..doc
- 鸿蒙系统首发仪式,鸿蒙系统首发终端荣耀智慧屏正式亮相