在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直接退出后 后台进程关闭的原因和对处相关推荐

  1. php网站后台无法退出,zblog“网站关闭”后进入不了后台的解决方法

    zblog后台网站设置--全局设置里面有个"关闭网站"功能,这个功能是给一些有临时关站的用户使用的.我也不知道为什么有一些人要关闭?可能没时间管理吧... 打开这个开关后,网站首页 ...

  2. nohup xxx 后台进程关闭,可以这样避免

    nohup xxx &后台进程关闭,可以这样避免 1.nohup 是 no hang up 的缩写,就是不挂断的意思,但没有后台运行,终端不能标准输入. 加一个nohup命令在最前面,表示不挂 ...

  3. 【初识太极】CAD异常退出后如何恢复备份文件?

    只要使用过一段时间CAD的,不管你用的是AUTOCAD,还是浩辰CAD,很少有没遇到过软件异常退出的.异常退出的原因有很多,有的是软件的BUG,有的是图中有错误数据,或者系统软件和硬件出现了问题,如断 ...

  4. 进程退出后占用的内存都去哪儿了?

    本文是<深入理解操作系统>第四章,从本章开始将开启第一个重要的主题:进程,彻底理解进程对程序员来说是极为重要的,本章就从程序员的角度来讲解到底什么是进程.操作系统是如何实现进程的.本文承接 ...

  5. Linux shell脚本执行后出现语法错误: 未预期的文件结尾

    Windows环境下编写了一个shell脚本,上传到Linux环境中执行,Linux shell脚本执行后出现 语法错误: 未预期的文件结尾. 出现了此错误提示,进行了如下的检查:1.检查Shell脚 ...

  6. C#应用程序退出后托盘图标(notify…

    很多时候,在我们的应用程序执行Application.Exit()退出后,我们设置的状态栏托盘图标都不会立即消失,当鼠标光标划过时才会消失.这是因为托盘图标的资源还没来得及释放造成的,要想解决这个问题 ...

  7. 解决 IDEA2022 push远程时取消analyze code后,退出后自动复原

    问题描述: 项目很大,修改的代码太多,提交的时候analyze code很久,按照帖子: idea提交代码时关闭代码分析_Java码农老王的博客-CSDN博客_idea关闭代码分析 设置了取消anal ...

  8. 远程桌面连接后远程计算机注销,windows2003远程桌面退出后系统自动注销的问题...

    问题现象: 最近在windows2003 r2下设置了定时任务,需要一定时间把数据从一个目录拷贝到另外的目录.结果出现很奇怪的问题: 1.手动执行批处理无问题. 2.定时后,用户退出后的一定时间内,执 ...

  9. linux nohup命令启动程序,关闭shell,程序依然会关闭

    linux nohup命令启动程序,关闭shell,程序依然会关闭 解决办法 执行完nohup命令之后,使用exit命令退出shell登录 > nohup ./aaa & > ex ...

  10. 快播退出后网络任务无法继续下载怎么办呢

    有没有发现有时候快播退出后网络任务全部消失不能继续下载,这是怎么一回事? 可能是开启了具有清理功能的软件,关闭此类软件后再点播试试.如果没有开启此类软件,请将QvodPlayer文件夹中的playli ...

最新文章

  1. 机械毕业本科生竟被嵌入式单片机公司录取?
  2. AngularJS 实现的输入自动完成补充功能
  3. 算法与数据结构--数组和链表的区别
  4. 自定义Dictionary支持线程安全
  5. SAP用户权限控制大解析及权限进阶分析
  6. c++ vector 赋值_C++中vector用法
  7. Kickstart+NFS+DHCP+TFTP+PXElinux实现CentOS的网络自动安装
  8. 信息竞赛进阶指南--单调队列模板
  9. PTA 程序设计天梯赛(21~40题)
  10. MAMP Pro for Mac(PHP/MySQL开发环境)v6.6
  11. 企业API接口设计(token、timestamp、sign)之具体实现
  12. 深度操作系统 V15.11——心随意动 畅享云端
  13. 国内服务器免备案教程 可使用80端口进入后台
  14. React的消息订阅全过程
  15. 2022-01-24:K 距离间隔重排字符串。 给你一个非空的字符串 s 和一个整数 k,你要将这个字符串中的字母进行重新排列,使得重排后的字符串中相同字母的位置间隔距离至少为 k。 所有输入的字符串
  16. CANOPEN 协议 命令字
  17. Python Scrapy 爬虫 - 爬取多级别的页面
  18. 寄存器英文全称中文翻译英文对照表
  19. python 在指定位置显示图片并调整窗口大小(或图片大小)
  20. 干饭篇-西红柿炒鸡蛋+银耳红枣粥

热门文章

  1. 网络操控软件兴起:思科利润率受压
  2. 如何隐藏UITabBar 已经如何使已经隐藏的TabBar重现(原创)
  3. DPDK收发包全景分析
  4. Performance Engineering of Software Systems (一)——准备工作
  5. deadline调度器之(一):原理
  6. android 看门狗引起crash分析
  7. uboot 使用fdt命令查看设备树
  8. 51Nod 1637 幸运数字转换(思维)
  9. 201约花鸟画 考c语言试题,全国计算机二级C语言上机100题..doc
  10. 鸿蒙系统首发仪式,鸿蒙系统首发终端荣耀智慧屏正式亮相