ssh 远程防止断网神器 - screen 命令

我们在使用需要 SSH 远程登录到Linux 服务器,经常运行一些需要很长时间才能完成的任务,比如AI训练、系统备份、ftp传输等等。通常情况下我们都是为每一个这样的任务开一个远程终端窗口,因为它们执行的时间太长了。必须等待它们执行完毕,在此期间不能关掉窗口或者断开连接,否则这个任务就会被杀掉,一切半途而废了。screen命令可以很好的解决这个问题。实现在断开SSH的情况下,在服务器上继续执行程序。
 

网上有许多 screen 命令的详解,这里我们只介绍日常最简单的使用方法:

在使用 ssh 远程登录之后,我们可以输入 screen 命令来启动一个 screen 的会话,出现提示信息之后,直接按空格或回车符即可进入 screen 会话。

$ screen

GNU Screen version 4.06.02 (GNU) 23-Oct-17

Copyright (c) 2015-2017 Juergen Weigert, Alexander Naumov, Amadeusz Slawinski
Copyright (c) 2010-2014 Juergen Weigert, Sadrul Habib Chowdhury
Copyright (c) 2008-2009 Juergen Weigert, Michael Schroeder, Micah Cowan, Sadrul Habib Chowdhury
Copyright (c) 1993-2007 Juergen Weigert, Michael Schroeder
Copyright (c) 1987 Oliver Laumann

This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as
published by the Free Software Foundation; either version 3, or (at your option) any later version.

This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.

You should have received a copy of the GNU General Public License along with this program (see the file COPYING); if not, see
http://www.gnu.org/licenses/, or contact Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111-1301
 USA.

Send bugreports, fixes, enhancements, t-shirts, money, beer & pizza to [email protected]


Capabilities:
+copy +remote-detach +power-detach +multi-attach +multi-user +font +color-256 +utf8 +rxvt +builtin-telnet

                     [Press Space or Return to end.]

进入会话后和我们日常 ssh 操作界面并无不同。 在操作完成后可以使用 exit 命令先退出 screen 会话,在运行中主动退出而不中断运行,可使用 Ctrl + a  d 键来让 screen 窗口后台运行。如果在操作过程中 ssh 的会话异常终了,这时也不用担心, screen 窗口会进入后台运行。为了恢复会话,我们可以输新远程使用 ssh 登录,然后使用  screen -r 来恢复上次的 screen 会话。 在只有一个 screen 会话时,会直接恢复到这个会话。有多个会话时,输入命令后,会提示让你选择一个会话ID,这时我们在 -r 选项后加上 ID 的数字或全字符都可以进入选中的 screen 会话。

$ screen -r
There are several suitable screens on:
	20756.pts-0.user	(2022年09月19日 11时36分54秒)	(Detached)
	20733.pts-0.user	(2022年09月19日 11时36分41秒)	(Detached)
Type "screen [-d] -r [pid.]tty.host" to resume one of them.

$ screen -r 20733.pts-0.user
$ screen -r 20733

 如果觉得 ID 不容易记住,可以在启动 screen 命令后加上 -S  会话名。这样恢复时也可以使用会话名进行恢复。效果如下:

$ screen -S Hello
[detached from 21203.Hello]

$ screen -ls
There are screens on:
	21203.Hello	(2022年09月19日 12时53分01秒)	(Detached)
	20835.pts-0.user	(2022年09月19日 11时40分48秒)	(Detached)

$ screen -r Hello

在命令执行过程中,操作终端内往往会有很多内容输出,我们也希望能查看 screen 的历史记录,这时可以使用 screen 的拷贝模式,也就是在 screen 会话中使用 ctrl + a  ESC 进入拷贝模式。

在copy mode下可以回滚、搜索、复制就像用使用 vi 一样。在copy mode下有这些快捷键:

Ctrl-b :Backward、PageUp
Ctrl-f :Forward、PageDown

按esc退出copy mode。

在copy mode下不会实时的同步输出信息。也就是说进入copy mode后,你所能看到的就是从开始到你进入时的所有输出,以后的输出并不会同步。所以需要esc退出再查看。

在运行后台任务过程中,我们通常希望将输出的日志进行保存,可有如下几种方法:

1.  使用 -L 参数

% screen -L 

当前目录或用户目录下生成 screenlog.0 文件,文件中是包含控制字符的屏幕输出流,用编辑器查看会有乱码的现象存在。回看时,可以使用 cat 命令在终端中升成文本记录。

2. screen 运行中使用  Ctrl-a  H, 将后续的输出保存到  screenlog.0 文件

3. 使用 copy mode 选取需要输出的屏幕内容,执行的操作如下:首先,在大体判断一下输出日志的行数,这是因为 screen 的行缓冲区有行数限制,超出时会删除最早的内容。我们需要使用 -h 参数来启动 screen 命令,指定行缓冲区的行数:

% screen -h 100000

运行完成后,进入copy mode。找到想输出的内容起点和终点,比如从第一行首字符开始到输出结束:

Ctrl-a ESC :进入copy mode

1 G:光标移到 screen 缓冲区的首行。 用 H 键或数字 0 键移到行首。

【空格】或 Enter键:选定开始位置。

G: 光标移到 screen 缓冲区的尾行。 用 L 键或 $ 键移到行尾。

【空格】或 Enter键:选定结束位置。

Ctrl-a >: 将选中的区块内容保存到  /tmp/screen_exchange 文件中。

screen 还有很多更强的、更复杂的功能。可以参考这篇文章 远程神器 screen命令的保姆级详解教程

猜你喜欢

转载自blog.csdn.net/whyliu_/article/details/126930641