前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Linux上后台保持Terminal交互运行的两种方式

Linux上后台保持Terminal交互运行的两种方式

原创
作者头像
Mintimate
修改2021-07-06 12:07:56
7.4K0
修改2021-07-06 12:07:56
举报
文章被收录于专栏:Mintimate's Blog

作者:Mintimate

博客:https://www.mintimate.cn

Mintimate's Blog,只为与你分享

封面图片嗷
封面图片嗷

后台运行

Linux上,如果一个进程需要保持后台运行,尤其是在Linux服务器上,后台运行程序、避免因为SSH连接断开而导致进程停止运行时,该怎么办?

很简单,相信很多人会选择systemd注册进程,但是如果是想保持交互,或者只是偶尔使用呢?(毕竟,systemd配置还是挺麻烦的……)

其实,大体有两种方法:

  • nohup &(Ctril+Z)
  • screen虚拟终端【推荐】

使用场景

什么情况下Linux上需要在终端(terminal)上,后台运行Linux呢?答案很简单:Linux服务器。以我购买的腾讯云轻量应用服务器为例:

腾讯云轻量应用服务器的Linux镜像
腾讯云轻量应用服务器的Linux镜像

我们一般使用SSH登录服务器,但是运行一些java项目(如:Springboot的JavaWeb):

使用腾讯云轻量应用服务器运行JavaWeb
使用腾讯云轻量应用服务器运行JavaWeb

这个时候,我们终端关闭->SSH断开->JavaWeb随即停止运行,所以,我们需要用一些方法,后台运行终端的交互。

Nohup

Nohup全称是:no hang up,中文直接以上就是不挂起,为什么是no hang up呢?其实很简单,举个例子,我们前台运行Aria2进程:

运行Aria2
运行Aria2

这个时候,Aria2进程交互就是挂起(hang up),保持在终端前台。

而Nohup(no hang up),就是这样的:

nohup运行Aria2
nohup运行Aria2

这样,终端没有输出内容,就是Nohup,对应地,我们可以在当前目录下看到终端输出内容:

Nohup时,终端输出记录到nohup.out文件内
Nohup时,终端输出记录到nohup.out文件内

当然,仅仅只有nohup是不够的,还需要&参数

&参数

这里的&参数,可不是“和”的意思,是让当前内容后台运行:

添加参数
添加参数

但是这样是不够的,因为你的终端并没有挂起。

noup的使用

有了&参数,接下来,我们使用nohup就可以后台运行了:

代码语言:txt
复制
# zsh aria2Strat.sh为我用zsh启动Aria2
nohup zsh aria2Strat.sh &
后台运行
后台运行

这样就可以后台运行Aria2了,不过如果进程没有守护进程,或者是回发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也可以):

代码语言:txt
复制
# 运行Aria2
nohup zsh aria2Start.sh
运行aria2Strat.sh
运行aria2Strat.sh

之后,按Control+Z(Windows用户应该是Ctril+Z):

Control+Z
Control+Z

这个时候,Aria2已经暂停服务并移动至后台,我们可以使用jobs命令查看:

代码语言:txt
复制
jobs
查看效果
查看效果

之后,我们可以使用bg命令,运行Aria2后台继续执行:

代码语言:txt
复制
bg %1
继续运行
继续运行

其中,%1指代[1]

回到这个后台进程,输入:

代码语言:txt
复制
fg %1

disown参数

如果Control+Z方法不行,我们可以使用disown参数:

代码语言:txt
复制
nohup zsh aria2Start.sh & disown
disown参数
disown参数

这个时候,就可以退出终端了。

当然,这种方法……无法回到后台进程的控制台内了~

screen虚拟终端

我其实更推荐screen,这个算是一个终端神奇

安装screen

首先,我们安装screen:

代码语言:txt
复制
# Debian
apt-get install screen
# CentOS 8以前
yum install screen
# CentOS 8以后
yum install epel-release
yum install screen

创建虚拟终端

官方给的方法是

代码语言:txt
复制
screen -S #虚拟终端名字

比如:

创建叫aria2的虚拟终端
创建叫aria2的虚拟终端

但是,我更推荐使用screen -R #虚拟终端名字来创建。

创建好后:

虚拟终端
虚拟终端

在这个界面,运行程序即可:

运行程序
运行程序

之后,按Control+a进入screen的指令接受,再按d即可回到主终端。这个时候,关闭终端,Aria2也不会停止运行。

查看已经存在的screen

查看已经存在的screen很简单,输入:

代码语言:txt
复制
screen -ls

即可查看:

查看已经存在screen
查看已经存在screen

重新进入screen

刚刚我们查看了已经存在的screen,接下来我们重新进入,有两种方式:

  • PID进入:使用screen -r #PID即可进入
  • screen名:使用screen -R #screen名即可进入

比如,我使用screen - R进入:

代码语言:txt
复制
screen -R aria2
回到虚拟终端内
回到虚拟终端内

总结

本文主要提供两种非systemd注册的方式,后台运行Linux进程的方法,个人更推荐使用screen。

受限于篇幅,screen我并没有详解,接下来我应该会出一篇screen详解的文章教程,敬请期待嗷。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 后台运行
  • 使用场景
  • Nohup
    • &参数
      • noup的使用
        • 后台运行
          • Control-Z
          • disown参数
      • screen虚拟终端
        • 安装screen
          • 创建虚拟终端
            • 查看已经存在的screen
              • 重新进入screen
              • 总结
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档