前言

通常我们时常需要在终端同时执行多个命令,这时候,可以利用加分号的形式实现:

1
$ cmd1;cmd2;cmd3

即 在多个命令之间使用;隔开。与之类似的,有&&表示一起执行等等。

然而事实上,这种运行内部依然具有执行上的时间顺序差。而且命令属于短时命令才达到预期。

也就是说,当一个命令需要不断print数据,而且迟迟不结束时(例如下载某些文件网速较慢),就压根不存在“同时运行”。

也就是说,我们正在寻求一种实现真正的多进程运行命令的方法。

在远程连接服务器的时候,需要面对这种问题

解决方法

再开一个会话/终端,实现两个(或多个)终端间的“·平行视界


但是如果是远程连接服务器的情况下,还会面临另一个问题,那就是当SSH连接断开时,命令也就截止了。

原因是因为断开连接后,终端会收到SIGHUP(hang-up 挂断)信号从而关闭该会话期的子进程。

那么,应该怎么实现断开远程连接,长时命令仍然继续运行呢?

这就是接下来即将介绍的多终端不挂断命令!

nohup命令(不推荐)

nohup 英文全称 no hang up(不挂起)

用于在系统后台不挂断地运行命令,退出终端不会影响程序的运行

语法格式

1
$ nohup Command [ Arg … ] [ & ]

参数说明

Command:要执行的命令。

Arg:一些参数,可以指定输出文件。

&:让命令在后台执行,终端退出后命令仍旧执行。

使用说明

待更

screen命令(推荐)

如果程序需要交互等复杂的操作,推荐使用功能强大的screen。

screen 提供了 ANSI/VT100 的终端模拟器,使它能够在一个真实终端下运行多个全屏的伪终端

注意:不是所有Linux都自带screen。

查询安装包信息:

1
$ rpm -qa|grep screen

安装

自带则跳过这一步

1
2
3
4
5
# CentOS 
$ yum install screen

# Debian
$ apt-get install screen

使用流程

🔔打开一个新会话,并对会话命名

1
$ screen -S <name1>

🔔于是,键入想要运行的命令

🔔暂时离开当前会话(快捷键)

Ctrl+A 之后再键入D

🔔打开另一个会话,命名

1
$ screen -S <name2>

🔔键入想要运行的命令,再Ctrl+A then D暂时离开

🔔杀死窗口:Ctrl+A then K关闭并杀死当前窗口


📝查看会话:

1
$ screen -ls

📝恢复某会话:

1
$ screen -r <name>

其他命令

待更

常见问题处理

  1. 使用screen -r时提示There is no screen to be resumed matching xxx

    原因:在重新连接服务器时,即上次连接后没有主动断开连接(比如突然断网)。

    解决方法:

    1
    $ ps all

    查看所有进程,结果如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    F   UID   PID  PPID PRI  NI    VSZ   RSS WCHAN  STAT TTY        TIME COMMAND
    4 0 7961 27427 20 0 28920 1520 - R+ pts/0 0:00 ps all
    4 0 23255 23254 20 0 21612 3932 wait Ss pts/5 0:00 /bin/bash
    4 0 26472 26471 20 0 21612 3972 wait Ss pts/6 0:00 /bin/bash
    4 0 27427 27342 20 0 22792 5100 wait Ss pts/0 0:00 -bash
    4 0 27444 27342 20 0 22792 5060 wait Ss pts/2 0:00 -bash
    4 0 27566 27444 20 0 42500 4164 poll_s S+ pts/2 0:01 top
    4 0 28573 28572 20 0 21612 3644 poll_s Ss+ pts/1 0:00 /bin/bash
    0 1000 32460 31875 20 0 31640 3068 pause S+ pts/0 0:00 screen -S boss

    此处以screen -S boss为例。

    首先直接将其kill掉(放心,不会杀死进程)

    1
    $ kill -9 31875 #后面是对应进程的PPID码

    之后重新进入就可以啦~

    1
    $ screen -r boss
  2. 暂无

参考资料

1.远程连接Linux,如何使程序断开连接后继续运行|CSDN

2.Linux nohup 命令 | 菜鸟教程

3.使用screen -r时提示|CSDN