Linux退出终端,后台运行的程序也被中止的解决方法

当SSH连接断开或终端窗口关闭时,由于SIGHUP信号的影响,运行在该终端下的程序通常会被终止。为解决此问题,可以使用nohup命令来确保程序在后台继续运行,不受SSH断开的影响。nohup命令会阻止SIGHUP信号,并将输出重定向到nohup.out文件。
摘要由CSDN通过智能技术生成

一、问题描述:

		今天本地机器被重启,而本地通过终端运行的远程服务器程序也被关闭了,这是意料之外的事情

二、根因定位:

	元凶:SIGHUP 信号,
	让我们来看看为什么关掉窗口/断开连接会使得正在运行的程序死掉。
	在Linux/Unix中,有这样几个概念:
    进程组(process group):一个或多个进程的集合,每一个进程组有唯一一个进程组ID,即进程组长进程的ID。
   会话期(session):一个或多个进程组的集合,有唯一一个会话期首进程(session leader)。会话期ID为首进程的ID。
   会话期可以有一个单独的控制终端(controlling terminal)。与控制终端连接的会话期首进程叫做控制进程(controlling process)。当前与终端交互的进程称为前台进程组。其余进程组称为后台进程组。
   根据POSIX.1定义:
   挂断信号(SIGHUP)默认的动作是终止程序。
   当终端接口检测到网络连接断开,将挂断信号发送给控制进程(会话期首进程)。
   如果会话期首进程终止,则该信号发送到该会话期前台进程组。
  一个进程退出导致一个孤儿进程组中产生时,如果任意一个孤儿进程组进程处于STOP状态,发送SIGHUP和SIGCONT信号到该进程组中所有进程。(关于孤儿进程参照:http://blog.csdn.net/hmsiwtv/article/details/7901711 )
 结论:
       因此当网络断开或终端窗口关闭后,也就是SSH断开以后,控制进程收到SIGHUP信号退出,会导致该会话期内其他进程退出。
        在该终端中运行的命令的进程是该终端的子进程,当这个终端退出后,其子进程也会被中止

简而言之:就是ssh 打开以后,bash等都是他的子程序,一旦ssh关闭,系统将所有相关进程杀掉!! 导致一旦ssh关闭,执行中的任务就取消了

三、解决方案:

    1、使用nohup命令,nohup 英文全称 no hang up(不挂起),用于在系统后台不挂断地运行命令,退出终端不会影响程序的运行。nohup 命令,在默认情况下(非重定向时),会输出一个名叫 nohup.out 的文件到当前目录下,如果当前目录的 nohup.out 文件不可写,输出重定向到 $HOME/nohup.out 文件中。
    nohup python weather.py &
    关闭终端,程序也可以正常运行
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值