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
[]+ Stopped nohup ./fore.sh
# jobs
[]- Running nohup ./back.sh &
[]+ Stopped nohup ./fore.sh
# ps -o pid,ppid,pgid,sid,cmd
PID PPID PGID SID CMD
/bin/bash ./back.sh
/bin/bash ./fore.sh
# fg
nohup ./fore.sh ### 关闭窗口并重新登录 ### # ps -eo pid,paid,pgid,sid,cmd |grep -E "back|fore"
/bin/bash ./back.sh
/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"
/bin/bash ./back.sh
/bin/bash ./fore.sh ### 关闭窗口并重新登录 ### # ps -eo pid,ppid,pgid,sid,cmd |grep -E "back|fore"
/bin/bash ./back.sh
/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
[]+ Stopped
# jobs
[]- Running ./back.sh &
[]+ Stopped ./fore.sh
# ps -eo pid,ppid,pgid,sid,cmd |grep -E "back|fore"
/bin/bash ./back.sh
/bin/bash ./fore.sh
# disown -h %
# disown -a %
# jobs
[]+ Stopped ./fore.sh
# fg
./fore.sh ### 关闭窗口并重新登录 ### # ps -eo pid,ppid,pgid,sid,cmd |grep -E "back|fore"
/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直接退出后 后台进程关闭的原因和对处的更多相关文章
- ssh连接断开后 shell进程退出
问题描述:当SSH远程连接到服务器上,然后运行一个服务 ./catalina.sh start,然后把终端开闭(切断SSH连接)之后,发现该服务中断,导致网页无法访问. 解决方法:使用nohup命 ...
- Linux下java nohup 后台运行关闭后进程停止的原因,不挂断后台运行命令
Linux下java nohup 后台运行关闭后进程停止的原因,不挂断后台运行命令 今天写sh脚本发现一终止命令程序就停止运行了,检查了很久才发现后面少了个&字符导致的!错误写法:nohup ...
- 单片机main函数退出后发生什么——以stm32为例
STM32:main函数退出后发生什么? 我们都在说单片机要运行在无限循环里,不能退出,可退出之后会发生什么? 讨论STM32启动过程的文章数不胜数,可main函数结束之后会发生什么却少有讨论. 几日 ...
- silverlight 退出系统(关闭当前网页),通过调用JS
确认后直接退出系统,关闭当前页面 页面部分: <HyperlinkButton x:Name="LinkExit" Style="{StaticResource L ...
- eclipse 导出Runnable JAR file ,双击无法执行原因与解决 双击后闪退的原因 批处理java打包文件 @echo off start javaw -jar *.jar
eclipse 导出Runnable JAR file 导出后如果系统没有JRE,双击无法运行,需要用命令方法 安装后解决,如图 双击后闪退的原因,通过执行 java -jar TingGe.jar ...
- vue 首次加载缓慢/刷新后加载缓慢 原因及解决方案
# vue 首次加载缓慢/刷新后加载缓慢 原因及解决方案 最近做项目发现一个问题,页面每次刷新后加载速度都非常慢,20s左右,在开发环境则非常流畅,几乎感觉不到,本文参考望山的各种方案优化 1,关闭打 ...
- Docker退出容器不关闭容器的方法
进入docker容器后如果退出容器,容器就会变成Exited的状态,那么如何退出容器让容器不关闭呢? 如果要正常退出不关闭容器,请按Ctrl+P+Q进行退出容器,这一点很重要,请牢记! 以下示例为退出 ...
- Linuxqq shell脚本安装后的卸载
官方下载和帮助页面: 传送门 linuxqq_2.0.0-b1 的时候,并没有发布 MIPS64 的 DEB 包,只能用 .sh 安装,需要手动删除卸载.愚人节发布的 beta2 新增了 MIPS64 ...
- Linux 进程退出后自动启动
/********************************************************************** * Linux 进程退出后自动启动 * 说明: * 在系 ...
随机推荐
- 《Advanced Bash-scripting Guide》学习(十三):引用变量的两个例子
本文所选的例子来自于<Advanced Bash-scripting Gudie>一书,译者 杨春敏 黄毅 例1. 使用""可以防止单词分割,将变量看成一个整体,没有& ...
- 删除OSX中第三方的「偏好设置」程序(.prefPane)
打开Finder,按Command+Shift+G,输入 /Library/PreferencePanes ~/Library/PreferencePanes 前一个是全局的配置项目录,第二个是当前用 ...
- orale存储技术
一.存储的主要作用 1.海量存储 阵列存储 光盘存储 磁带存储 数据迁移 文件服务器,跨平台文件共享 2.容灾 数据备份及恢复:磁带.光盘.阵列 数据复制:本地镜像.远程镜像 3.高 ...
- nyoj-130-相同的雪花(hash)
题目链接 /* Name:NYOJ-130-相同的雪花 Copyright: Author: Date: 2018/4/14 15:13:39 Description: 将雪花各个分支上的值加起来,h ...
- 用VMware vSphere搭建虚拟化平台
核心组件 vSphere是一款可以独立安装和运行在祼机上的系统,因此与其他我们以往见过的VMware Workstation 软件不同的是它不再依存于宿主操作系统之上.在ESXi安装好以后,我们可以通 ...
- Java演示手机发送短信验证码功能实现
我们这里采用阿里大于的短信API 第一步:登陆阿里大于,下载阿里大于的SDK a.在阿里大于上创建自己的应用 b.点击配置管理中的验证码,先添加签名,再配置短信模板 第二步:解压相关SDK,第一个为j ...
- 【LeetCode】673. Number of Longest Increasing Subsequence
题目: Given an unsorted array of integers, find the number of longest increasing subsequence. Example ...
- 常用Kerberos指令
1. 以超管身份进入kadminkadmin.local addprinc -randkey root/master1@JENKIN.COM //生成随机key的principal addprin ...
- 蓝桥杯 算法训练 ALGO-119 寂寞的数
算法训练 寂寞的数 时间限制:1.0s 内存限制:256.0MB 问题描述 道德经曰:一生二,二生三,三生万物. 对于任意正整数n,我们定义d(n)的值为为n加上组成n的各个数字的和.例如,d(2 ...
- STM32 -- 故障记录
1.串口2无法发送数据 1)串口2和串口1使用的时钟总线不同: usart1:RCC_APBPeriphClockCmd(RCC_APB2Periph_USART1,ENABLE); usart2:R ...