Linux下使命令不受终端断开的影响,保持在后台运行的几种方法及原理
记录一下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会从当前列表中删除任务的进程标识。
Linux下使命令不受终端断开的影响,保持在后台运行的几种方法及原理的更多相关文章
- linux进程后台运行的几种方法 - nohup/setsid/&
linux进程后台运行的几种方法 - nohup/setsid/& [转载] 我们经常会碰到这样的问题,用 telnet/ssh 登录了远程的 Linux 服务器,运行了一些耗时较长的任务 ...
- nohup+命令+& 【退出终端后,程序依然在后台运行】
[ 如果你正在运行一个进程,而且你觉得在退出帐户时该进程还不会结束,那么可以使用nohup命令. 该命令可以忽略所有挂断(SIGHUP)信号,在你退出帐户/关闭终端之后继续运行相应的进程. nohup ...
- linux进程后台运行的几种方法
转载:http://hi.baidu.com/ntuxmzvdpzbnuxq/item/79131b93f606a348f0421562 我 们经常会碰到这样的问题,用 telnet/ssh 登录了远 ...
- Linux如何让进程在后台运行的三种方法详解
问题分析: 我们知道,当用户注销(logout)或者网络断开时,终端会收到 HUP(hangup)信号从而关闭其所有子进程.因此,我们的解决办法就有两种途径:要么让进程忽略 HUP 信号,要么让进程运 ...
- Linux --- 程序后台运行的几种方法
有时候我们运行一个程序,耗时比较长,所以在快下班的时候或是网络不稳定的时候就比较抓狂. 今天分享几个我在工作中用到的把程序放在后台运行的方法. nohup $ nohup --h Usage: noh ...
- Linux下使Shell 命令脱离终端在后台运行
--Linux下使Shell 命令脱离终端在后台运行------------------------------------2014/02/14你是否遇到过这样的情况:从终端软件登录远程的Linux主 ...
- linux 后台执行nohup 命令,终端断开无影响
nohup /root/start.sh & 在shell中回车后提示: [~]$ appending output to nohup.out原程序的的标准输出被自动改向到当前目录下的nohu ...
- Linux下script命令录制、回放和共享终端操作script -t 2> timing.log -a output.session # 开始录制
Linux下script命令录制.回放和共享终端操作 [日期:2018-09-04] 来源:cnblogs.com/f-ck-need-u 作者:骏马金龙 [字体:大 中 小] 另一篇终端会话共 ...
- Linux下who命令之C语言实现
Linux下who命令之C语言实现 Step1:前期准备 首先要有一个清楚的认识:linux中一切皆文件 实现who命令,who命令也是Linux中的一个文件,那我们怎么找到它呢?我们可以" ...
随机推荐
- 【Springboot】用Springboot Admin监控你的微服务应用
1 简介 目前,微服务大行其道,各大小公司争相学习模仿,把单体应用拆得七零八落.服务多了,运行的实例多了,给运维人员的压力就更大了.如果有十几个应用,单单做Health Check就已经够费时间的了. ...
- 一起学Vue之模板语法
概述 Vue.js 使用了基于 HTML 的模板语法,允许开发者声明式地将 DOM 绑定至底层 Vue 实例的数据.所有 Vue.js 的模板都是合法的 HTML ,所以能被遵循规范的浏览器和 HTM ...
- JQuery 基本使用、操作样式、简单动画
JQ与JS JQ是JS写的插件库,就是一个JS文件 凡是用JQ能实现的,JS都能实现,JS能实现的,JQ不一定能实现 引入 BootCDN:https://www.bootcdn.cn/jquery/ ...
- Java对象导论
Java对象导论 1.1 抽象过程 万物皆对象. 程序是对象的集合(即:类),他们通过发送消息(调用方法)来告知彼此要做的. 每个对象都有自己的由其他对象所构成的存储(引用其他对象或基本类型,即组合) ...
- [Codeforces 1244C] The Football Season
思维加枚举 题意 :足球赛,赢平所得到的分数分别为w和d,w>d,分别求赢平输的场数,输出一组即可,即x+y+z=n 且 xw+yd=p的一组解. 可以扩展公约数做,但由于注意到d和w<1 ...
- 文件系统常用命令与fdisk分区
一.硬盘结构 1.硬盘的逻辑结构 硬盘的大小是使用"磁头数×柱面数×扇区数×每个扇区的大小"这样的公式来计算的.其中磁头数(Heads)表示硬盘总共有几个磁头,也可以理解成为硬盘有 ...
- 从零开始的vue学习笔记(一)
前言 项目要用vue.js,今天开始自学vue.js官方教程,记录下自己的学习摘要,方便后面查阅(此笔记按照学习天数,每天一篇) Vue.js是什么 Vue是一套用于构建用户界面的渐进式框架,Vue ...
- Skulpt在线模拟运行Python工具
1. Skulpt是一个完全依靠浏览器端模拟实现Python运行的工具 2. 不需要预处理.插件或服务器端支持,只需编写python并重新载入即可. 3. 由于代码完全是在浏览器中运行的,所以不必担心 ...
- Hibernate 框架入门
接着上一篇的 Hibernate 框架的了解,我们就继续学习 Hibernate 框架.这次就进入 Hibernate 框架的入门学习. 首先在学习 Hibernate 框架之前,我们要准备好我们需要 ...
- JVM学习分享-练习题
package org.fenixsoft.clazz; public class TestClass { private int m; public int inc() { return m + 1 ...