Reptyr-将正在运行的进程从一个终端移到另一个终端而无需关闭它
让我们说,我们正在通过本地系统中的SSH会话在远程服务器中运行进程。
我们不知道远程作业将需要很长时间才能完成。
我们只想将正在运行的作业留在远程服务器本身上,并在不终止远程作业的情况下关闭SSH会话,然后在以后或者第二天将其重新连接到SSH会话。
当然,我们可以在屏幕/tmux会话中启动作业,并在不退出远程作业的情况下从屏幕会话中分离,然后退出SSH会话。
但是,如果我们忘记首先开始屏幕会话,则以后无法重新连接到正在运行的进程。
一旦关闭SSH会话,正在运行的进程也将在远程系统上关闭。
那么,在这种情况下我们会怎么做?
没问题。
这是Reptyr命令提供帮助的地方。
Reptyr是用于在pty之间移动正在运行的进程的命令行工具。
只需从本地台式机或者笔记本电脑通过SSH会话启动需要花费很长时间才能在远程系统上完成的过程,然后关闭SSH会话,返回首页,然后在第二天重新连接正在运行的过程。
此外,我们可以轻松地将长时间运行的进程从一个终端迁移/移动到另一个终端,而无需终止它。
此教程描述了如何使用Reptyr命令将正在运行的进程移至新的终端。
在远程系统上安装Reptyr
注意:远程系统应该已安装tmux或者屏幕,以便移动正在运行的进程。
在Arch Linux及其衍生版本中,运行:
$sudo pacman -S reptyr
在基于DEB的系统中,运行以下命令来安装Reptyr:
$sudo apt-get install reptyr
要安装屏幕或者tmux,请运行:
$sudo apt-get install tmux screen
在RHEL/CentOS/Scieintific Linux/Fedora上,reptyr在存储库中不可用。
因此,我们可以如下所示进行编译和安装。
安装以下准备工作:
$sudo yum install git tmux screen
$sudo yum groupinstall 'development tools'
以root用户身份使用命令的Git clone reptyr存储库:
$git clone https://github.com/nelhage/reptyr.git
进入reptyr目录:
$cd reptyr/
运行以下命令进行编译和安装。
$make
$sudo make install
我在CentOS 7 64位服务器版本中从源代码编译并安装了Reptyr,如上所述,它运行得很好。
使用Reptyr将正在运行的进程从一个终端移到另一个终端而无需关闭它
通常,我们通过SSH从任何本地系统连接到远程服务器,如下所示。
# ssh Hyman@theitroad_Of_remote_system
连接到远程系统后,开始长时间运行的过程。
例如,我将使用wget命令下载Ubuntu 16.04桌面ISO。
# wget http://cdimage.ubuntu.com/daily-live/current/xenial-desktop-amd64.iso
输出示例:
如我们在上面的屏幕截图中所见,总下载大小为1.5GB,需要90多分钟才能完成。
我不想等待那么久,也不想退出远程工作。
因此,我要做的是在新终端中启动屏幕或者tmux会话,使用reptyr实用程序在屏幕或者tmux会话内获取正在运行的进程。
最后,我将终止两个ssh会话,并在需要时重新连接到正在运行的进程。
让我们打开一个新的终端窗口或者新选项卡,然后通过在终端中键入screen或者tmux来启动屏幕或者tmux会话:
# screen
或者
# tmux
如我们在上面的屏幕截图中所见,该屏幕会话已启动并且正在运行。
现在,让我们使用以下命令从新终端中查找正在运行的进程:
# ps -a
输出示例:
PID TTY TIME CMD 2320 pts/0 00:00:11 wget 2343 pts/1 00:00:00 screen 2358 pts/2 00:00:00 ps
记下wget进程的PID,并使用以下命令将正在运行的进程添加到屏幕会话中:
# reptyr 2320
完毕!如我们在上面的屏幕快照中所见,wget进程已从旧终端移到(迁移)到新的终端窗口(与屏幕会话一起运行的窗口)。
从原始终端中移走正在运行的进程后,它将立即关闭,并在我们在新终端中将其保留的位置开始继续。
现在,我们可以安全地分离或者关闭终端,该作业将继续在远程服务器上运行。
要脱离屏幕或者tmux会话,请按CTRL + A + D。
从屏幕会话分离后,将出现以下消息。
[detached from 2344.pts-1.server1]
要重新添加正在运行的进程,请SSH到远程系统:
# ssh Hyman@theitroad
其中:
192.168.1.150是我的远程服务器IP地址。
如果使用屏幕会话,请运行以下命令:
# screen -Dr
对于tmux会话,运行:
# tmux attach
瞧!正在运行的进程已再次重新连接,我们将在此处看到该进程仍在运行。
如上面的屏幕快照所示,wget作业没有被中断或者终止,并且仍在运行。
只要远程系统已启动并正在运行,它将继续运行。