我们经常会碰到这样的问题,用 telnet/ssh 登录了远程的 Linux 服务器,运行了一些耗时较长的任务, 结果却由于网络的不稳定导致任务中途失败。如何让命令提交后不受本地关闭终端窗口/网络断开连接的干扰呢?下面举了一些例子, 您可以针对不同的场景选择不同的方式来处理这个问题。

先介绍一下hangup 名称的来由

在 Unix 的早期版本中,每个终端都会通过 modem 和系统通讯。当用户 logout 时,modem 就会挂断(hang up)电话。 同理,当 modem 断开连接时,就会给终端发送 hangup 信号来通知其关闭所有子进程。

nohup/setsid/&

场景:

如果只是临时有一个命令需要长时间运行,什么方法能最简便的保证它在后台稳定运行呢?

解决方法:

我们知道,当用户注销(logout)或者网络断开时,终端会收到 HUP(hangup)信号从而关闭其所有子进程。因此,我们的解决办法就有两种途径:要么让进程忽略 HUP 信号,要么让进程运行在新的会话里从而成为不属于此终端的子进程。

1、nohup的使用

nohup 无疑是我们首先想到的办法。顾名思义,nohup 的用途就是让提交的命令忽略 hangup 信号。

nohup 的使用是十分方便的,只需在要处理的命令前加上 nohup 即可,标准输出和标准错误缺省会被重定向到 nohup.out 文件中。一般我们可在结尾加上"&"来将命令同时放入后台运行,也可用">filename 2>&1"来更改缺省的重定向文件名。

nohup 示例

nohup ping baidu.com &

2。setsid

nohup 无疑能通过忽略 HUP 信号来使我们的进程避免中途被中断,但如果我们换个角度思考,如果我们的进程不属于接受 HUP 信号的终端的子进程,那么自然也就不会受到 HUP 信号的影响了。setsid 就能帮助我们做到这一点。让我们先来看一下 setsid 的帮助信息

setsid 示例setsid ping baidu.com

screen

场景:

我们已经知道了如何让进程免受 HUP 信号的影响,但是如果有大量这种命令需要在稳定的后台里运行,如何避免对每条命令都做这样的操作呢?

解决方法:

此时最方便的方法就是 screen 了。简单的说,screen 提供了 ANSI/VT100 的终端模拟器,使它能够在一个真实终端下运行多个全屏的伪终端。screen 的参数很多,具有很强大的功能,我们在此仅介绍其常用功能以及简要分析一下为什么使用 screen 能够避免 HUP 信号的影响。

使用 screen 很方便,有以下几个常用选项:

screen -S yourname -> 新建一个叫yourname的session

screen -ls -> 列出当前所有的session

screen -r yourname -> 回到yourname这个session

screen -d yourname -> 远程detach某个session

screen -d -r yourname -> 结束当前session并回到yourname这个session

Screen中止某个会话(session)

screen -S some_name -X quit

screen 示例

1.新建一个叫yourname的终端

screen -S newname

2.可运行要执行的命令

ping baidu.com

3.C-a d -> detach,暂时离开当前session,将目前的 screen session (可能含有多个 windows) 丢到后台执行,并会回到还没进 screen 时的状态,此时在 screen session 里,每个 window 内运行的 process (无论是前台/后台)都在继续执行,即使 logout 也不影响。

linux程序已经在后台运行冻结了_linux 让程序在后台运行的几种可靠方法相关推荐

  1. linux程序已经在后台运行冻结了_Linux 让程序在后台执行

    有些程序我们在打开时,会一直占用我们的终端,而且终端还不能关掉,所以这时候我们就需要让程序在后台运行. 1.命令:nohup nohup python -u run.py > run.log 2 ...

  2. win8 java不是内部或外部命令_win8系统运行java提示“ava不是内部或外部命令两种解决方法...

    Java一种可以撰写跨平台应用软件的面向对象的程序设计语言,最近有一些小伙伴使用win10操作系统的时候遇到了一个问题,win8系统win8系统运行java突然提示"java不是内部或外部命 ...

  3. win7 计算机管理的命令,Win7运行cmd命令提示“命令提示符已被系统管理员停用”三种解决方法...

    在运行win7操作系统中,经常使用运行命令对系统进行一些设置.最近有用户在Win7系统下运行CDM命令时,提示"命令提示符已被系统管理员停用"(如图),导致无法正常使用命令功能,遇 ...

  4. python是在linux系统下运行的吗_Linux系统下python代码运行shell命令的方法

    方法一:os.popen #!/usr/bin/python#-*- coding: UTF-8 -*- importos, sys#使用 mkdir 命令 a = 'ls'b= os.popen(a ...

  5. R包安装时安装程序包****时退出的状态不是0,或者版本不适的一种解决方法。

    Bioconductor中包几乎都是安装下面代码安装.比如:miRBaseVersions.db包 if (!requireNamespace("BiocManager", qui ...

  6. linux 后台运行jar包命令,Linux 运行jar包命令(Cent OS 7后台运行jar包)

    Linux 运行jar包命令如下: 方式一 特点:当前ssh窗口被锁定,可按CTRL + C打断程序运行,或直接关闭窗口,程序退出 那如何让窗口不锁定? 方式二 java -jar shareniu. ...

  7. linux 运行go文件路径,go程序部署到linux上运行-Go语言中文社区

    go 语言版本:go1.9.2 开发环境:win10 部署环境:ubuntu 14.04.6 一.win10上的操作 1.在src目录下依次执行set CGO_ENABLED=0.set GOOS=l ...

  8. android unity 关闭应用_在后台运行的Android Unity应用程序

    我有一个在Android上运行的Unity应用程序.它也会在应用程序放入后台时继续运行.它不使用服务在后台运行.相反,这个应用程序会创建一个新线程,并且该线程在应用程序处于后台时继续运行.在后台运行的 ...

  9. 怎么在linux的cmd中运行c项目,如何在cmd窗口编译运行c语言程序?

    / 这个很简单,只需要下载一个C/C++编译器,添加一下环境变量,之后就能在cmd窗口中编译运行C语言程序了,下面我简单介绍一下实现过程,主要内容如下: 1.下载C/C++编译器,这里可以下载MinG ...

最新文章

  1. unity加载ab后,场景shader不起效问题(物件表现黑色)
  2. 如何在Jupyter Lab中显示pyecharts的图形?
  3. js-在url后面添加时间戳清除浏览器打开页面的缓存
  4. #每日一题:小计算器(模拟)
  5. 02_Influxdb开启登录认证
  6. Rabbtmq 消费端-幂等性保障
  7. centos下配置java环境变量
  8. pytorch---模型加载与保存(3)保存和加载 Checkpoint 用于推理/继续训练
  9. ENVI5.3.1使用Landsat 8影像进行预处理及分析实例操作
  10. Flink 中的应用部署:当前状态与新应用模式
  11. 微信之微信支付(封装)--jsapi
  12. 刚刚申请的博客,自己也是新手!
  13. 程序员离职代码交接_程序员离职大半个月,被老板命令回单位讲代码,员工:一次1万!...
  14. 通过BeanDefinitionReader获取BeanDefinition的三种不同方式
  15. Grasshopper: Architectural Prototyping Grasshopper建筑原型 Lynda课程中文字幕
  16. P2906 [USACO08OPEN]牛的街区Cow Neighborhoods
  17. 管理理论模型:PEST、5W2H、时间管理、生命周期、逻辑树、金字塔、SMART原则
  18. java爬取当当网所有分类的图书信息(ISBN,作者,出版社,价格,所属分类等)
  19. 你真的知道面向过程和面向对象的区别吗?
  20. 小程序-实现怎么跳转打开 H5 网页链接(或跳转至公众号文章)

热门文章

  1. JS脚本实现CSDN免登陆免关闭广告插件自动展开“阅读更多”内容
  2. jQuery用于请求服务器的函数
  3. 机器学习:数据驱动的科学
  4. Excel—SUMPRODUCT用法指南
  5. (双引号)与 ' '(单引号)的区别
  6. mockcpp的so加载失败问题
  7. 公积金贷款不受影响 组合贷款有特殊
  8. 基于Python的BPSK音频的波形和频谱
  9. Python 动态变量名定义与调用
  10. CentOS下安装Telnet