文档章节

Linux下使命令不受终端断开的影响,保持在后台运行的几种方法及原理

o
 osc_g8254g7s
发布于 2019/08/19 20:00
字数 1109
阅读 17
收藏 0

精选30+云产品,助力企业轻松上云!>>>

摘自https://www.ibm.com/developerworks/cn/linux/l-cn-nohup/

记录一下Linux下使命令不受终端断开的影响,保持在后台运行的几个方法及其原理。当用户注销logout或者网络中断时,终端会受到HUP(hangup)信号从而关闭其所有子进程。因为解决方法大体有两种:要么让进程忽略HUP信号,要么让进程运行在新的会话里从而成为不属于此终端下的子进程。

1(本地单元测试通过)nohup命令可以让要执行的命令忽略HUP信号,再加上&可以保证命令一直在后台运行。

例:nohup commandXXX > test.log 2>&1 &

命令解析:

  • nohup可以让commandXXX这个命令忽略HUP信号;
  • 第一个>代表将命令的标准输出重定向到指定的地方,这里是test.log
  • 2>&1代表重定向标准错误重定向到标准输出,这里标准输出已经被重定向到test.log,所以标准错误也会输出到test.log。这里引申一下:

Linux中标准输入即STDIN , 在/dev/stdin ,一般指键盘输入, shell里代号是0;

Linux中标准输出STDOUT, 在/dev/stdout,一般指终端(terminal), 就是显示器, shell里代号是1;

Linux中标准错误STDERR,在/dev/stderr也是指终端(terminal),不同的是,错误信息送到这里 shell里代号是2

  • 最后一个&表示让命令在后台运行
  • 关闭终端后可以通过ps -ef|grep commandXXX命令查找到后台进程。

2(本地单元测试通过)setsid命令可以让进行运行在新的会话下,即不属于当前终端的子进程。那么即使当前终端发出了HUP信号,也不会影响该进程。

例:setsid commandXXX

其实通过观察进程中的父进程号(PPID)发现一些端倪,使用setsid后进行的PPID为1(即为init进程ID),并非当前终端的进程ID。

3(本地单元测试通过)将一个或多个命令用()括起来在shell中运行,所提交的作业并不在作业列表中,即无法通过jobs查看到。新提交的进程的PPID为1。

例:(commandXXX)

4(本地单元测试通过)若未加上述任何处理就执行了命令,如何补救才能让其不受HUP信息的影响呢?答案是作业调度。对于某个已执行的命令,经过以下几个步骤可以让其忽略HUP信号:

  • 先使用ctrl+z命令将正在执行的命令变为job作业,; 
  • 使用jobs可以查看到具体的作业号(jobid);
  • 再用bg %jobid命令让其在后台运行;
  • 最后使用disown -h jobid 即可使该作业忽略HUP信号

5(未安装此命令,暂未验证)有大量这种需要稳定的在后台运行的命令时,如何避免对每条命令都做上述的重复操作呢?答案是screen。screen提供了ANSI/VT100的终端模拟器,能够在一个真实终端下运行多个全屏的伪终端。screen具有很多参数,功能强大,在此仅简要分析一下为什么使用screen可以避免HUP信号的影响:

  • screen -dnS session new 建立一个处于断开模式下的会话(并指定其会话名);
  • screen -list 列出所有会话;
  • screen -r session name 重新连接指定会话;
  • ctrl -a D暂时断开当前会话;

当我们用-r连接到screen会话时,就进入了一个伪终端,不会再受到HUP信号的影响了。

其他命令:

  • pstree -H pid 查看进程号对应的进程命令的树形结构
  • fg %jobid 将某个挂起的进程放回前台
  • bg %jobid 将某个挂起的进程调到后台继续运行,这一点在调试代码时尤其有用,因为将代码编辑器挂起到后台再重新返回时,光标定位仍停留到上次挂起时的位置,避免了重新地凝望的麻烦。
  • ctrl +c 止当前命令
  • jobs -l 列出所有任务的pid,jobs的状态可以是running/stopped/terminated,但若任务终止了(kill),shell会从当前列表中删除任务的进程标识。
o
粉丝 0
博文 500
码字总数 0
作品 0
私信 提问
加载中
请先登录后再评论。
linux进程后台运行的几种方法 - nohup/setsid/&

linux进程后台运行的几种方法 - nohup/setsid/& [转载] 我们经常会碰到这样的问题,用 telnet/ssh 登录了远程的 Linux 服务器,运行了一些耗时较长的任务, 结果却由于网络的不稳定导致任务中...

osc_j89isia8
2019/10/26
2
0
Linux 技巧:让进程在后台可靠运行的几种方法

想让进程在断开连接后依然保持运行?如果该进程已经开始运行了该如何补救? 如果有大量这类需求如何简化操作? 6 评论: 申 毅, 软件工程师, IBM 中国软件开发中心 2008 年 5 月 29 日 内容 ...

heyJude
2015/07/02
25
0
Linux 技巧:让进程在后台可靠运行的几种方法【转】

我们经常会碰到这样的问题,用 telnet/ssh 登录了远程的 Linux 服务器,运行了一些耗时较长的任务, 结果却由于网络的不稳定导致任务中途失败。如何让命令提交后不受本地关闭终端窗口/网络断...

osc_t2w0zvsf
2019/04/29
2
0
Linux让进程在后台可靠运行的几种方法

Linux 技巧:让进程在后台可靠运行的几种方法 我们经常会碰到这样的问题,用 telnet/ssh 登录了远程的 Linux 服务器,运行了一些耗时较长的任务, 结果却由于网络的不稳定导致任务中途失败。...

goodlook
2018/06/28
2
0
在Linux中,如何设置前、后台命令和程序的执行?命令后直接加 & ,这个命令就在后台执行;

命令后直接加 & ,这个命令就在后台执行;正在运行的命令,使用 Ctrl+z ,就挂起;jobs命令,可以现实后台,包括挂起的命令;使用 bg %作业号 就可以把挂起的命令在后台执行;使用 fg %作业号...

adbug
2015/04/30
4
0

没有更多内容

加载失败,请刷新页面

加载更多

平时使用的Lszrz到底是什么协议?说说Xmodem/Ymodem/Zmodem

XMODEM, YMODEM, and ZMODEM 由于平时使用rz/sz较多,r/s好理解,一个send一个receive。但是由不太清楚z是什么意思,故有此文。 sx/rx, sb/rb (b=batch)和sz/rz分别实现了xmodem,ymodem和z...

独钓渔
15分钟前
9
0
真正的强智能时代已经到来。道翰天琼认知智能机器人平台API大脑。

最近,我常说人工智能的寒冬快要来了,提醒业界要做好思想准备,但同时我也说:冬天来了,春天就不会远了…… 2019年6月我写了篇文章《深度学习的问题究竟在哪?》,说到深度学习的一个主要问...

jackli2020
24分钟前
24
0
什么是控制型人格,控制型人格的筛查测试

一、 什么是控制性人格 拥有控制型人格的人,他们会尽力的隐藏自己的意图,但是又会使用很微妙的方式来利用周围人的弱点,进而占取便宜时,使他们能够得到自己想要的东西。这类人的控制欲非常...

蛤蟆丸子
33分钟前
14
0
【Spring】Spring AOP 代理对象生成逻辑源码分析

1. spring aop案例(POJO注入) 1.0 被代理接口 TargetInterface /** * 被代理的接口 * @author Yang ZhiWei */public interface TargetInterface { void show(); String show......

ZeroneLove
42分钟前
36
0
聊聊dubbo-go的gracefulShutdownFilter

序 本文主要研究一下dubbo-go的gracefulShutdownFilter gracefulShutdownFilter dubbo-go-v1.4.2/filter/filter_impl/graceful_shutdown_filter.go type gracefulShutdownFilter struct {......

go4it
42分钟前
30
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部