Linux上后台保持Terminal交互运行的三种方式:nohub、screen和tmux
镜像下载、域名解析、时间同步请点击 阿里云开源镜像站
后台运行
Linux上,如果一个进程需要保持后台运行,尤其是在Linux服务器上,后台运行程序、避免因为SSH连接断开而导致进程停止运行时,该怎么办?
很简单,相信很多人会选择systemd
注册进程,但是如果只是临时使用,比如:wget
在下载文件。或者只是偶尔使用呢?(毕竟,systemd
配置还是挺麻烦的……)
其实,大体有三种方法:
- nohup &(Ctril+Z)
- screen虚拟终端【推荐】
- tmux终端复用器【推荐】
使用场景
什么情况下Linux上需要在终端(terminal)上,后台运行Linux呢?
举例:Minecraft服务器运行、Springboot打包的jar……
这个时候,我们终端关闭->SSH断开->JavaWeb随即停止运行
。这个是因为,我们退出SSH连接时,发送SIGHUP
信号给控制会话,进而导致我们前台会话上的程序停止运行。
所以,我们需要用一些方法,后台保存运行终端的交互。
Nohup
Nohup全称是:no hang up
,中文直接以上就是不挂起,为什么是no hang up呢?其实很简单,举个例子:我们前台运行Aria2进程:
这个时候,Aria2进程交互就是挂起(hang up),保持在终端前台。
而Nohup(no hang up),就是这样的:
这样,终端没有输出内容,就是Nohup,对应地,我们可以在当前目录下看到终端输出内容:
当然,仅仅只有nohup
是不够的,还需要&
参数
&参数
这里的&
参数,可不是“和”的意思,是让当前内容后台运行。
noup的使用
有了&
参数,接下来,我们使用nohup就可以后台运行了:
# zsh aria2Strat.sh为我用zsh启动Aria2
nohup zsh aria2Strat.sh &
这样就可以后台运行Aria2了。你可以输入jobs
命令查看后台的进程:
jobs
不过如果进程没有守护进程,或者是回发SIGHUP信号
的话...关闭或者退出终端依旧会终止进程(这里就是终止Aria2进程)。
后台运行
如果,我们的脚本或程序,即没有守护线程,也没有SIGHUP信号呢?其实还是有两种方法,首先看Noup的选择参数:
- disown:在sh中,可以通过
disown -h job名
忽略SIGHUP 信号
;disown命令将移除job表中特定的job,这也意味着该job不再接受任何信号。 - Control-Z:通过 Control+Z 可以将当前进程挂起(放置后台并暂停运行),可通过
fg 命令
恢复至前台,也通过bg将挂起的进程后台运行。 - shopt:shopt huponexit命令让sh在登录用的shell退出时,发送
SIGHUP信号
至所有的jobs。
也就是,我们可以使用disown
或者Control-Z
方式,在终端关闭情况下,后台运行进程。
Control-Z
这个方法其实很简单,用了这个方法,甚至不需要&
参数(如果不需要保留终端上输出日志到nohup.out
,不加nohup也可以):
# 运行Aria2
nohup zsh aria2.sh
之后,按Control+Z
(Windows用户应该是Ctril+Z):
这个时候,Aria2已经暂停服务并移动至后台,我们可以使用jobs
命令查看:
jobs
之后,我们可以使用bg
命令,运行Aria2后台继续执行:
bg %1
其中,%1指代[1]
。
相当于,用了&
参数,就做了Control+Z
和bg %1
回到这个后台进程,输入:
fg %1
disown参数
如果Control+Z
方法不行,我们可以使用disown
参数:
nohup zsh aria2Start.sh & disown
这个时候,就可以退出终端了。
当然,这种方法……无法回到后台进程的控制台内了~
screen虚拟终端
我其实更推荐screen,这个算是一个终端神器
。
安装screen
首先,我们安装screen:
# Debian
apt-get install screen
# CentOS 8以前
yum install screen
# CentOS 8以后
yum install epel-release
yum install screen
创建虚拟终端
官方给的方法是
screen -S #虚拟终端名字
比如:
但是,我更推荐使用
screen -R #虚拟终端名字
来创建。以后有机会说原因。
创建好后:
在这个界面,运行程序即可:
之后,按Control+a
进入screen的指令接受,再按d
即可回到主终端。这个时候,关闭终端,Aria2也不会停止运行。
查看已经存在的screen
查看已经存在的screen很简单,输入:
screen -ls
即可查看:
重新进入screen
刚刚我们查看了已经存在的screen,接下来我们重新进入,有两种方式:
- PID进入:使用screen -r #PID即可进入
- screen名:使用screen -R #screen名即可进入
比如,我使用screen - R进入:
screen -R aria2
tmux终端复用器
最后,我们看看tmux终端复用器,这个本质上和screen差不多(我个人还是喜欢用screen,别的原因,就是习惯了……)
安装tmux
首先是安装tmux
# centos
sudo yum install tmux
# ubuntu
sudo apt-get install tmux
之后,一般就可以使用了。
创建tmux终端
创建tmux终端很简单,也是一条命令:
tmux new -s demo
其中,demo
为自定义名称。创建好后:
之后,按Control+b
tmux指令接受,再按d
即可回到主终端。这个时候,关闭终端,运行的程序也不会停止运行。
查看已经存在的tmux
和screen一样,tmux查看已经存在的tmux也很简单:
tmux ls
重新进入tmux
重新进入的方法很简单:
tmux -a -t demo
这样就进入成功了:
总结
本文主要提供三种非systemd
注册的方式,后台运行Linux进程的方法,个人更推荐使用screen或者tmux,有机会单独给大家讲讲这两个命令。
有小伙伴会问screen和tmux具体区别,其实使用起来基本没区别,细节的话,就是screen进入后,可以无限套娃新的screen……tmux里可不会让使用者这样套娃……
本文转自:https://juejin.cn/post/7055128927953485832
Linux上后台保持Terminal交互运行的三种方式:nohub、screen和tmux的更多相关文章
- dubbo服务运行的三种方式
dubbo服务运行,也就是让生产服务的进程一直启动.如果生产者进程挂掉,也就不存在生产者,消费者不能进行消费. Dubbo服务运行的三种方式如下:1.使用Servlet容器运行(Tomcat.Jett ...
- 【dubbo】服务提供者运行的三种方式
[dubbo]服务提供者运行的三种方式 学习了:https://blog.csdn.net/yxwb1253587469/article/details/78712451 1,使用容器: 2,使用自建 ...
- 在Linux安装配置Tomcat 并部署web应用 ( 三种方式 )
系统版本:centos6.5版本 java版本:1.7 一.准备工作 1.java -version 检查是否有java环境,没有则需要去安装并配置到环境变量中. 2.下载tomcat包,下载地址:h ...
- Ajax上传数据和上传文件(三种方式)
Ajax向后端发送数据可以有三种方式:原生Ajax方式,jQuery Ajax方式,iframe+form 方式(伪造Ajax方式) <!DOCTYPE html> <html la ...
- Linux 进程后台运行的几种方式(screen)
Ctrl+z/bg/nohup/setsid/& 在Linux中,如果要让进程在后台运行,一般情况下,我们在命令后面加上&即可,实际上,这样是将命令放入到一个作业队列中了: ./rsy ...
- spring mvc从后台往前台传参数的三种方式
第一种:使用Model对象(常用) 第一步:使用model对象往前台传递数据 第二步:在jsp中接收从后台传递过来的参数 第二种:使用HttpServletRequest对象 第一步:使用HttpSe ...
- 在Linux上显示某个进程的线程的几种方式
方法一:PS 在ps命令中,"-T"选项可以开启线程查看.下面的命令列出了由进程号为的进程创建的所有线程. 1.$ ps -T -p 方法二: Top top命令可以实时显示各个线 ...
- gradle springboot 项目运行的三种方式
一.java -jar 二.eclipse中 Java Application 三.命令行 gradle bootRun
- Linux上后台运行node和springboot服务
环境:Ubuntu18.04 阿里云云服务器 尝试全局安装forever和pm2均失败,最后以linux自带的nohub启动,以前同样用nohub启动springboot 命令: nohup npm ...
随机推荐
- Intellij IDEA出现java.lang.ClassNotFoundException: com.mysql.jdbc.Driver处理办法
菜单-->File-->project structure-->Modules-->Dependencies-->添加MySQL的驱动包:mysql-connector- ...
- MySQL架构原理之存储引擎InnoDB数据文件
MySQL架构原理之体系架构 - 池塘里洗澡的鸭子 - 博客园 (cnblogs.com)中简单介绍了MySQL的系统文件层,其中包含了数据文件.那么InnoDB的数据文件是如何分类并存储的呢? 一. ...
- JVM学习——类加载机制(学习过程)
JVM--类加载机制 2020年02月07日14:49:19-开始学习JVM(Class Loader) 类加载机制 类加载器深入解析与阶段分解 在Java代码中,类型的加载.连接与初始化过程中都是在 ...
- 解决POI多线程导出时数据错乱问题
项目里有一个导出功能,但随着数据量大量上涨,导出时间长到不可忍受,遂重写此接口,多线程导出的代码并不复杂,每页有一条线程负责写入,利用线程池去调度,用countdownLatch保证在所有数据写完后再 ...
- Spring的AOP的底层实现原理?
aop是ioc的一个扩展功能,先有的ioc,再有的aop,只是在ioc的整个流程中新增的一个扩展点而已:BeanPostProcessor 底层实现用的是动态代理 AOP应用场景 场景一: 记录日志 ...
- mysql学习+再复习
mysql 函数 单行函数 exists 是否存在 字符函数 concat(a,b)拼接两个字符串 ifnull(a+b,0) 如果a+b等于null,则返回0 upper,lower 大小写 ...
- 基于nodejs的阿里云DDNS服务,支持多网卡绑定
前段几天写的,自用. 想着也许有和我一样需求的同学,所以开源发出来了. 提供阿里云的DDNS设置,支持多网卡多域名绑定. 特性 支持阿里云DDNS设置 支持针对多个线路多个网卡单独设置域名 支持IPv ...
- HTML表格总结
知识小记: 表格的主要目的:用于HTML展示数据,不适用于布局. 表格由行的单元格组成,没有列,常识上的"列"的个数取决于行中单元格的个数. 表格本来就很丑,颜色线条美化交给css ...
- k8s搭建链路监控:skywalking
skywalking架构及简介 官网:https://github.com/apache/skywalking 简介 Java, .NET Core, NodeJS, PHP, and Python ...
- 可视化BI软件为企业提升数据分析效率
可视化BI软件经过几十年的不断发展,已成为大型企业进行商业决策不可缺少的工具.在BI软件问世之前,由于做数据分析可视化的时间较长.人力成本较高,企业一直处于忽视的状态.可视化BI软件的出现极大地提高 ...