在我们退出SSH会话后,4种方法要保留命令运行

时间:2020-03-21 11:42:25  来源:igfitidea点击:

我们希望运行一个需要很长时间才能完成的命令,然后退出SSH会话,但即使我们不再与远程系统连接,即使我们也不再连接命令。
你是怎样做的?
正如我们所知,一旦我们退出SSH,就会终止所有正在运行的作业。
你会从头开始工作吗?
你不必。
其中我已经给出了4个方法来从SSH会话中注销后运行的命令。

在Linux中退出SSH会话后,保持命令

可能有很多方法可以做到这一点。
但是,我发现以下方法很容易和直截了当。

方法1 - 使用screen

screen工具是一个具有VT100/ANSI终端仿真的全屏窗口管理器,允许我们在不退出远程作业的情况下安全地分离SSH会话。
它将有助于使用多个远程服务器的人。
在大多数Linux操作系统中预先安装screen命令。
就在情况下,如果未安装,则可以使用分发包管理器安装它。

关于Arch Linux:

$sudo pacman -S screen

在Rhel,CentOS和其他基于RPM的系统上:

$sudo yum install screen

在Debian,Ubuntu和其他基于Deb的系统上:

$sudo apt-get install screen

在SUSE/OpenSUSE上:

$sudo zypper install screen

在远程系统上安装屏幕后,启动screen会话:

$screen

屏幕会话已立即启动。
现在运行我们想要在远程系统上执行的任何工作或者任务。

我要下载Ubuntu 16.04镜像:

$wget http://mirror.waia.asn.au/ubuntu-releases/xenial/ubuntu-16.04.2-desktop-amd64.iso

Ubuntu 16.04 ISO的大小约为1.5GB。
在普通宽带连接中下载近一小时即可。
你不必等待那久。
只需留下在远程系统上运行的下载过程,然后按"Ctrl-A"后跟"D"退出屏幕会话。
我们将看到下面的输出。

[detached from 1365.pts-0.server]

从screen会话中分离后,我们可以从远程系统注销。
远程作业将继续在服务器中运行。

我们可以随时使用命令重新连接到屏幕会话:

$screen -r

你会看到这个过程仍在那里运行。

如果我们有多个屏幕会话,则需要键入屏幕会话ID以便重新连接它。
要查看屏幕会话数,请运行:

$screen -ls

示例输出将是:

There are screens on:There are screens on: 
     1382.pts-0.server (Saturday 15 July 2016 04:39:51  IST) (Detached) 
     1365.pts-0.server (Saturday 15 July 2016 04:38:44  IST) (Detached)
2 Sockets in /var/run/screen/S-sk.

现在,重新添加到所需的screen幕会话,例如1382,运行:

$screen -r 1382

有关更多详细信息,请参阅Man页面。

$man screen

方法2 - 使用TMUX

TMUX是终端多路复用器,可以从单个屏幕中创建,访问和控制多个终端。
可以从屏幕上分离TMUX会话并继续在后台运行,然后重新连接。
与屏幕工具一样,我们也可以使用TMUX从SSH会话中分离而不退出远程作业。
TMUX命令已预先安装在大多数Linux操作系统上。
就在情况下,如果未安装,则可以使用分发包管理器安装它。

关于Arch Linux:

$sudo pacman -S tmux

在Rhel,CentOS和其他基于RPM的系统上:

$sudo yum install tmux

在Debian,Ubuntu和其他基于Deb的系统上:

$sudo apt-get install tmux

在SUSE/OpenSUSE上:

$sudo zypper install tmux

安装TMUX后,使用命令启动TMUX会话:

$tmux

现在,开始你的任务或者工作。
然后通过按"Ctrl-B"后跟"D"来安全地分离Tmux会话而不退出远程作业。
这将分离tmux会话,但会在我们在后台运行的情况下留下我们正在进行的。
即使我们与会话断开连接,也意味着所有遥控器都将在运行。

要列出可用的会话,请运行:

$tmux ls
0: 1 windows (created Sat May 15 16:51:35 2016) [134x33]
1: 1 windows (created Sat May 15 16:53:58 2016) [134x33]

我们可以使用相应的会话ID重新连接到TMUX会话,如下所示:

$tmux attach -t 0

有关更多详细信息,请参阅Man页面。

$man tmux

方法3 - 使用Reptyr

如果我们忘记首先启动屏幕/TMUX中的命令,该怎么办?
不用担心。
这是Reptyr有帮助的地方。
Reptyr在Ptys之间移动运行进程。

  • reptyr - 将一个终端从一个终端移动到另一个终端的运行过程而不关闭它

方法4 - 使用NOHUP

Nohup,代表否挂断,又是另一个命令行实用程序,以运行Linux命令即使我们与SSH会话断开连接。
由于它是GNU Coreutils的一部分,因此我们不必安装它。
它可以预先安装在所有Linux发行版中。

使用绝对容易。
登录远程系统后,我们所要做的就是:

$nohup <command> &

是的,这很简单。

例子:

$nohup wget http://mirror.waia.asn.au/ubuntu-releases/xenial/ubuntu-16.04.2-desktop-amd64.iso &

现在,我们可以退出SSH会话。
远程作业将继续运行。

登录远程系统并运行以下内容以查看正在运行的作业列表。

$jobs -l
[1]+ 1421 Running nohup wget http://mirror.waia.asn.au/ubuntu-releases/xenial/ubuntu-16.04.2-desktop-amd64.iso &

默认情况下,输出将添加到"nohup.out"。
当然,我们可以更改输出文件。

这是另一个例子。

$nohup find -size +10M > log.txt &

上面的命令将找到大于10米的大小的文件,并将输出写入log.txt文件。

有关更多详细信息,请参阅man页面。

$man nohup