为什么ssh一关闭,程序就不再运行了?
问题描述
- 当SSH远程连接到服务器上,然后运行一个程序,eg:
./test.sh
, 然后把终端开闭(切断SSH连接)之后,发现该程序中断.
原因
- 主要元凶: 挂断信号(SIGHUP) 信号
概念介绍
- 在Linux/Unix中,有这样几个概念:
- 进程组(process group): 一个或多个进程的集合,每一个进程组有唯一一个进程组ID,即进程组长进程的ID.
- 会话期(session): 一个或多个进程组的集合,有唯一一个会话期首进程(session leader). 会话期ID为首进程的ID.
- 会话期可以有一个单独的控制终端(controlling terminal).
- 与控制终端连接的会话期首进程叫做控制进程(controlling process).
- 当前与终端交互的进程称为前台进程组.
- 其余进程组称为后台进程组.
- 根据POSIX.1定义: 挂断信号(SIGHUP)默认的动作是终止程序。
解释
- 当终端接口检测到网络连接断开, 将挂断信号发送给控制进程(会话期首进程).
- 如果会话期首进程终止,则该信号发送到该会话期前台进程组.
- 一个进程退出导致一个孤儿进程组产生时, 如果任意一个孤儿进程组进程处于STOP状态, 发送 SIGHUP 和 SIGCONT 信号到该进程组中所有进程.
- 孤儿进程参照
结论
- 因此当网络断开或终端窗口关闭后, 也就是SSH断开以后, 控制进程收到 SIGHUP 信号退出, 会导致该会话期内其他进程退出.
- 简而言之: 就是 ssh 打开以后, bash等都是他的子程序, 一旦ssh关闭, 系统将所有相关进程杀掉!! 导致一旦ssh关闭, 执行中的任务就取消了.
相关问题
为什么守护程序就算是 ssh 打开的, 关闭ssh也不会影响其运行?
- 因为他们的程序特殊, 比如httpd –k start运行这个以后, 他不属于sshd这个进程组, 而是单独的进程组, 所以就算关闭了ssh, 和他也没有任何关系!
使用后台运行命令 &
能否将程序摆脱ssh进程组控制? 即关闭 ssh, 后台程序能否继续运行?
- 只要是ssh 打开执行的一般命令,不是守护程序,无论加不加&,一旦关闭ssh,系统就会用SIGHUP终止.
如何解决方案
- 在远端开启
tmux
, 在tmux
里运行程序, 此时运行的程序属于 tmux 的进程组, 不属于 ssh 进程组. - 使用
nohup
命令
为什么ssh一关闭,程序就不再运行了?的更多相关文章
- (转)为什么ssh一关闭,程序就不再运行了?
ref :https://www.cnblogs.com/lomper/p/7053694.html 问题描述 当SSH远程连接到服务器上,然后运行一个程序,eg: ./test.sh, 然后把终端开 ...
- Linux后台运行和关闭程序、查看后台任务
fg.bg.jobs.&.ctrl+z 1.& (最经常被用到) 这个用在一个命令的最后,可以把这个命令放到后台执行 2.ctrl + z 可以将一个正在 ...
- 关于Cocos2d-x程序运行时候提示关闭程序的框框的解决方法
1.这个情况是资源没有被加载的表现 如果AppDelegate.cpp里面没有文件索引的语句 FileUtils::getInstance()->addSearchPath("res& ...
- 如何在ASP.NET Core程序启动时运行异步任务(1)
原文:Running async tasks on app startup in ASP.NET Core (Part 1) 作者:Andrew Lock 译者:Lamond Lu 背景 当我们做项目 ...
- 用winsw让任何Windows程序都能运行为服务
用winsw让任何Windows程序都能运行为服务 winsw介绍 有时候我们需要在Windows下开机运行某些程序,这对于有图形界面的程序来说一般不是什么事,在选项中选中开机启动,然后它们就可以自动 ...
- 解决SSH窗口关闭,linux上的应用也关闭
最近在应用linux上的服务的时候发现一个问题 使用SSH远程连接启动的应用在SSH关闭的时候也死掉了,网上查了一下原因 大致是说SSH在关闭的时候会发送一个终止的指令给应用,然后就停了 简要的解决办 ...
- Ubuntu中如何使得程序在后台运行
Ubuntu中如何使得程序在后台运行 一.前言 在Ubuntu中有的程序启动需要执行改程序./bin目录下的文件,并且启动之后这个shell就不能使用和关闭了,非常的麻烦,因此就有了相应的命令来解决这 ...
- Ubuntu 在终端关闭情况下仍然运行进程
参考: 让Linux关闭终端(关闭SSH等)后,程序继续运行 Ubuntu 在终端关闭情况下仍然运行进程 在 Ubuntu 16.04 系统下使用 screen 命令在终端关闭情况下仍然运行进程.具体 ...
- 配置ASP.NET Web应用程序, 使之运行在medium trust
这文章会向你展示, 怎么配置ASP.NET Web应用程序, 使之运行在medium trust. 如果你的服务器有多个应用程序, 你可以使用code access security和medium ...
随机推荐
- PIE SDK栅格图层渲染变化事件监听
1. 功能简介 通过PIE SDK加载图层后,会默认的赋值给数据一个渲染.当用户重新给数据赋值Render或改变数据显示效果时,会触发渲染变化事件. 所谓的事件监听是在事件触发时,将执行用户指定的函数 ...
- vue 权限管理深度探究
实现思路如下:1.网页路由(route)中定义的每个路由都有meta属性,属性值防止可访问该路由的值.2.路由的全局前置守卫(beforeEach)会判断路由用户是否登录(未登录跳转至登录界面),以及 ...
- 完全原生javascript简约日历插件,js、html
效果图: 效果如图所示,尽管看上去并不是很美观,但是,基本上的功能还是已经完成了,码了一天多的时间,权当做复习一下js吧. 整个做下来差不多码了500多行代码~其实只是很多的样式也包括了在其中了,虽然 ...
- python 网页爬取数据生成文字云图
1. 需要的三个包: from wordcloud import WordCloud #词云库 import matplotlib.pyplot as plt #数学绘图库 import jieba; ...
- GreenPlum 大数据平台--web监控
一,安装web监控界面 01,准备 下载greenplum cc包,>> 解压缩 02,安装前配置 vim /greenplum/data/master/gpseg-/pg_hba.con ...
- intellij idea开发过程中遇到的问题
https://blog.csdn.net/wonder_dog/article/details/79289883
- this 显示绑定
function foo (el) { console.log(el, this.id); } var obj = { id: 'aaa' }; [2,6,3].forEach(foo, obj); ...
- List< >泛型集合
//一旦你确定了泛型的类型,集合里的元素已经有了确切的定义 List<int> list = new List<int>(); //创建泛型集合的对象 list.Add(); ...
- C# 数据库连接增删改查
C# 连接数据库 using System.Data.sqlCliect; // 加在头 main函数里面用法(删) //连接字符串 string Connectionstring = "s ...
- DevExpress 14.2 批量汉化
1.下载DevExpress_.NET_Localization_Resources_14.2汉化包 2.解压后将zh-CN或zh-CHS复制到安装目录如D:\Program Files (x86)\ ...