镜像下载、域名解析、时间同步请点击 阿里云开源镜像站

后台运行

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+Zbg %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+btmux指令接受,再按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的更多相关文章

  1. dubbo服务运行的三种方式

    dubbo服务运行,也就是让生产服务的进程一直启动.如果生产者进程挂掉,也就不存在生产者,消费者不能进行消费. Dubbo服务运行的三种方式如下:1.使用Servlet容器运行(Tomcat.Jett ...

  2. 【dubbo】服务提供者运行的三种方式

    [dubbo]服务提供者运行的三种方式 学习了:https://blog.csdn.net/yxwb1253587469/article/details/78712451 1,使用容器: 2,使用自建 ...

  3. 在Linux安装配置Tomcat 并部署web应用 ( 三种方式 )

    系统版本:centos6.5版本 java版本:1.7 一.准备工作 1.java -version 检查是否有java环境,没有则需要去安装并配置到环境变量中. 2.下载tomcat包,下载地址:h ...

  4. Ajax上传数据和上传文件(三种方式)

    Ajax向后端发送数据可以有三种方式:原生Ajax方式,jQuery Ajax方式,iframe+form 方式(伪造Ajax方式) <!DOCTYPE html> <html la ...

  5. Linux 进程后台运行的几种方式(screen)

    Ctrl+z/bg/nohup/setsid/& 在Linux中,如果要让进程在后台运行,一般情况下,我们在命令后面加上&即可,实际上,这样是将命令放入到一个作业队列中了: ./rsy ...

  6. spring mvc从后台往前台传参数的三种方式

    第一种:使用Model对象(常用) 第一步:使用model对象往前台传递数据 第二步:在jsp中接收从后台传递过来的参数 第二种:使用HttpServletRequest对象 第一步:使用HttpSe ...

  7. 在Linux上显示某个进程的线程的几种方式

    方法一:PS 在ps命令中,"-T"选项可以开启线程查看.下面的命令列出了由进程号为的进程创建的所有线程. 1.$ ps -T -p 方法二: Top top命令可以实时显示各个线 ...

  8. gradle springboot 项目运行的三种方式

    一.java -jar 二.eclipse中 Java Application 三.命令行 gradle bootRun

  9. Linux上后台运行node和springboot服务

    环境:Ubuntu18.04 阿里云云服务器 尝试全局安装forever和pm2均失败,最后以linux自带的nohub启动,以前同样用nohub启动springboot 命令: nohup npm ...

随机推荐

  1. 利用redis+AOP简单处理MQ冥等问题

    思路: 1.利用redis内部的串行执行特性,使用getandset()处理分布式问题; 2.注解提供入参选择,通过数据抽取后计算MD5值,实现业务性值的冥等: 代码区: 1.注解 1 /** 2 * ...

  2. pycharm工具使用

    转自: https://blog.csdn.net/u014044812/article/details/78727496   因公司的需求,需要做一个爬取最近上映的电影.列车号.航班号.机场.车站等 ...

  3. 34、python并发编程之多进程(操作篇)

    目录: 一 multiprocessing模块介绍 二 Process类的介绍 三 Process类的使用 四 守护进程 五 进程同步(锁) 六 队列(推荐使用) 七 管道 八 共享数据 九 信号量( ...

  4. Solution -「Tenka1 2019 D」Three Colors

    \(\mathcal{Description}\)   Link.   给定 \(\{a_n\}\),把每个元素划分入可重集 \(R,G,B\) 中的恰好一个,求满足 \(\sum R,\sum G, ...

  5. figlet 一个在linux生成字符串图案的玩具

    figlet官网 figlet官方字体库 figlet字体样例 安装方法 centos/redhat/fedora 发行版 yum install -y figlet debian/ubuntu 发行 ...

  6. Spring Boot数据访问之整合Mybatis

    在Mybatis整合Spring - 池塘里洗澡的鸭子 - 博客园 (cnblogs.com)中谈到了Spring和Mybatis整合需要整合的点在哪些方面,需要将Mybatis中数据库连接池等相关对 ...

  7. 『无为则无心』Python面向对象 — 51、私有成员变量(类中数据的封装)

    目录 1.私有成员变量介绍 (1)私有成员变量概念 (2)私有成员变量特点 (3)私有成员变量体验 2.属性私有化工作原理 3.定义成员变量的标识符规范 4.私有成员变量的获取和设置方式 1.私有成员 ...

  8. JDK动态代理为什么必须要基于接口?

    原创:微信公众号 码农参上,欢迎分享,转载请保留出处. 前几天的时候,交流群里的小伙伴抛出了一个问题,为什么JDK的动态代理一定要基于接口实现呢? 好的安排,其实要想弄懂这个问题还是需要一些关于代理和 ...

  9. OpenGL ES 3D空间中自定义显示空间

    在Android中,我们所熟知的是在ES管线中,其在图元装配时,会进行图元组装与图元分配,这样就回剪裁出来视景体中的物体.但是如果我想在3D场景中规定一个区域,凡是在这个区域中的物体就能显示出来,非这 ...

  10. 【C# IO 操作】 文件系统侦听 FileSystemWatcher

    侦听器 :FileSystemWatcher FileSystemWatcher常用属性有: Filter :获取或设置用于确定目录中要监视哪些文件的过滤器字符串.Filter 属性设置为空字符串 ( ...