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


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

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

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

    1. $ screen
    2. GNU Screen version 4.06.02 (GNU) 23-Oct-17
    3. Copyright (c) 2015-2017 Juergen Weigert, Alexander Naumov, Amadeusz Slawinski
    4. Copyright (c) 2010-2014 Juergen Weigert, Sadrul Habib Chowdhury
    5. Copyright (c) 2008-2009 Juergen Weigert, Michael Schroeder, Micah Cowan, Sadrul Habib Chowdhury
    6. Copyright (c) 1993-2007 Juergen Weigert, Michael Schroeder
    7. Copyright (c) 1987 Oliver Laumann
    8. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as
    9. published by the Free Software Foundation; either version 3, or (at your option) any later version.
    10. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
    11. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
    12. You should have received a copy of the GNU General Public License along with this program (see the file COPYING); if not, see
    13. http://www.gnu.org/licenses/, or contact Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301
    14. USA.
    15. Send bugreports, fixes, enhancements, t-shirts, money, beer & pizza to screen-devel@gnu.org
    16. Capabilities:
    17. +copy +remote-detach +power-detach +multi-attach +multi-user +font +color-256 +utf8 +rxvt +builtin-telnet
    18. [Press Space or Return to end.]

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

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

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

    1. $ screen -S Hello
    2. [detached from 21203.Hello]
    3. $ screen -ls
    4. There are screens on:
    5. 21203.Hello (2022年09月19日 12时53分01秒) (Detached)
    6. 20835.pts-0.user (2022年09月19日 11时40分48秒) (Detached)
    7. $ 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命令的保姆级详解教程

  • 相关阅读:
    css设置字体属性
    【容器化】docker和docker-compose/dockerfile和docker-compose.yml
    MySQL【运算符】
    tcp/ip协议和opc协议对比详解
    07.操作符
    网课没有摄像头,手机如何变成电脑摄像头?
    Vue父子传值子组件接收的6种方式
    死锁详细解读
    【算法之路】高精度算法(实现加减乘除)
    程序媛的mac修炼手册-- 小白入门Java篇
  • 原文地址:https://blog.csdn.net/whyliu_/article/details/126930641