签到成功

知道了

CNDBA社区CNDBA社区

Linux Screen 命令 使用说明

2023-08-12 00:34 602 0 原创 Linux
作者: dave

1 Screen 命令说明

一般运维都是通过 SSH 登录服务器,有时候一些命令的执行比较长,为了避免网络终端或者客户端异常导致执行失败,可以采用脚本的方式,在后台执行,但这需要先编写脚本,会比较麻烦。

Linux Screen 命令可以很好的帮助我们解决这个问题,它可以在一个终端窗口中同时运行多个会话,并且这些会话可以在你关闭终端窗口后继续运行。

http://www.cndba.cn/dave/article/131436

官网如下:
https://www.gnu.org/software/screen/http://www.cndba.cn/dave/article/131436

Screen 命令具备如下功能:

http://www.cndba.cn/dave/article/131436

  • 1.会话恢复:只要Screen本身没有终止,在其内部运行的会话都可以恢复。这一点对于远程登录的用户特别有用——即使网络连接中断,用户也不会失去对已经打开的命令行会话的控制。只要再次登录到主机上执行screen -r就可以恢复会话的运行。同样在暂时离开的时候,也可以执行分离命令detach,在保证里面的程序正常运行的情况下让Screen挂起(切换到后台)。这一点和图形界面下的VNC很相似。

  • 2.多窗口:在Screen环境下,所有的会话都独立的运行,并拥有各自的编号、输入、输出和窗口缓存。用户可以通过快捷键在不同的窗口下切换,并可以自由的重定向各个窗口的输入和输出。Screen实现了基本的文本操作,如复制粘贴等;还提供了类似滚动条的功能,可以查看窗口状况的历史记录。窗口还可以被分区和命名,还可以监视后台窗口的活动。

  • 3.会话共享:Screen可以让一个或多个用户从不同终端多次登录一个会话,并共享会话的所有特性(比如可以看到完全相同的输出)。它同时提供了窗口访问权限的机制,可以对窗口进行密码保护。

2 语法说明

screen [-AmRvx -ls -wipe][-d <作业名称>][-h <行数>][-r <作业名称>][-s ][-S <作业名称>]

参数说明:

-A  将所有的视窗都调整为目前终端机的大小。
-d <作业名称>  将指定的screen作业离线。
-h <行数>  指定视窗的缓冲区行数。
-m  即使目前已在作业中的screen作业,仍强制建立新的screen作业。
-r <作业名称>  恢复离线的screen作业。
-R  先试图恢复离线的作业。若找不到离线的作业,即建立新的screen作业。
-s  指定建立新视窗时,所要执行的shell。
-S <作业名称>  指定screen作业的名称。
-v  显示版本信息。
-x  恢复之前离线的screen作业。
-ls或—list  显示目前所有的screen作业。
-wipe  检查目前所有的screen作业,并删除已经无法使用的screen作业。http://www.cndba.cn/dave/article/131436

3 常用screen参数

screen -S yourname -> 新建一个叫yourname的session
screen -ls -> 列出当前所有的session
screen -r yourname -> 回到yourname这个session
screen -d yourname -> 远程detach某个session
screen -d -r yourname -> 结束当前session并回到yourname这个session

在每个screen session 下,所有命令都以 ctrl+a(C-a) 开始。
C-a ? -> 显示所有键绑定信息
C-a c -> 创建一个新的运行shell的窗口并切换到该窗口
C-a n -> Next,切换到下一个 window 
C-a p -> Previous,切换到前一个 window 
C-a 0..9 -> 切换到第 0..9 个 window
Ctrl+a [Space] -> 由视窗0循序切换到视窗9
C-a C-a -> 在两个最近使用的 window 间切换 
C-a x -> 锁住当前的 window,需用用户密码解锁
C-a d -> detach,暂时离开当前session,将目前的 screen session (可能含有多个 windows) 丢到后台执行,并会回到还没进 screen 时的状态,此时在 screen session 里,每个 window 内运行的 process (无论是前台/后台)都在继续执行,即使 logout 也不影响。 
C-a z -> 把当前session放到后台执行,用 shell 的 fg 命令则可回去。
C-a w -> 显示所有窗口列表
C-a t -> Time,显示当前时间,和系统的 load 
C-a k -> kill window,强行关闭当前的 window
C-a [ -> 进入 copy mode,在 copy mode 下可以回滚、搜索、复制就像用使用 vi 一样
    C-b Backward,PageUp 
    C-f Forward,PageDown 
    H(大写) High,将光标移至左上角 
    L Low,将光标移至左下角 
    0 移到行首 
    $ 行末 
    w forward one word,以字为单位往前移 
    b backward one word,以字为单位往后移 
    Space 第一次按为标记区起点,第二次按为终点 
    Esc 结束 copy mode 
C-a ] -> Paste,把刚刚在 copy mode 选定的内容贴上

4 使用示例

4.1 安装 screen

Linux 的 ISO 镜像自带改包,可以配置本地 yum 源,直接 yum 安装。

http://www.cndba.cn/dave/article/131436

[dave@www.cndba.cn ~]# yum install screen -y

Linux 平台下 yum 源 配置 手册
https://www.cndba.cn/dave/article/154

命令帮助:http://www.cndba.cn/dave/article/131436

[dave@www.cndba.cn ~]# screen -h
Use: screen [-opts] [cmd [args]]
 or: screen -r [host.tty]

Options:
-4            Resolve hostnames only to IPv4 addresses.
-6            Resolve hostnames only to IPv6 addresses.
-a            Force all capabilities into each window's termcap.
-A -[r|R]     Adapt all windows to the new display width & height.
-c file       Read configuration file instead of '.screenrc'.
-d (-r)       Detach the elsewhere running screen (and reattach here).
-dmS name     Start as daemon: Screen session in detached mode.
-D (-r)       Detach and logout remote (and reattach here).
-D -RR        Do whatever is needed to get a screen session.
-e xy         Change command characters.
-f            Flow control on, -fn = off, -fa = auto.
-h lines      Set the size of the scrollback history buffer.
-i            Interrupt output sooner when flow control is on.
-l            Login mode on (update /var/run/utmp), -ln = off.
-ls [match]   or
-list         Do nothing, just list our SockDir [on possible matches].
-L            Turn on output logging.
-m            ignore $STY variable, do create a new screen session.
-O            Choose optimal output rather than exact vt100 emulation.
-p window     Preselect the named window if it exists.
-q            Quiet startup. Exits with non-zero return code if unsuccessful.
-Q            Commands will send the response to the stdout of the querying process.
-r [session]  Reattach to a detached screen process.
-R            Reattach if possible, otherwise start a new session.
-s shell      Shell to execute rather than $SHELL.
-S sockname   Name this session <pid>.sockname instead of <pid>.<tty>.<host>.
-t title      Set title. (window's name).
-T term       Use term as $TERM for windows, rather than "screen".
-U            Tell screen to use UTF-8 encoding.
-v            Print "Screen version 4.01.00devel (GNU) 2-May-06".
-wipe [match] Do nothing, just clean up SockDir [on possible matches].
-x            Attach to a not detached screen. (Multi display mode).
-X            Execute <cmd> as a screen command in the specified session.
[dave@www.cndba.cn ~]#

4.2 新建终端

直接新建http://www.cndba.cn/dave/article/131436

[dave@www.cndba.cn ~]# screen

[dave@www.cndba.cn ~]# screen -ls
There are screens on:
        15003.pts-0.observer1   (Attached)
        14880.pts-1.observer1   (Attached)
2 Sockets in /var/run/screen/S-root.

[dave@www.cndba.cn ~]#

此时终端通过 ID 区分,但是这样还是不够清晰,可以通过-S 创建个 sockname,这样辨识度更高一些:

[dave@www.cndba.cn ~]# screen -S cndba
[dave@www.cndba.cn ~]# screen -ls
There are screens on:
        15042.cndba     (Attached)
        14880.pts-1.observer1   (Attached)
2 Sockets in /var/run/screen/S-root.

[dave@www.cndba.cn ~]#

注意:新screen 终端打开以后,如果直接关闭会话,或者网络异常,那么会直接变成分离 Detached 状态,然后重连即可。

4.3 查看窗口和窗口名称

实际上当打开一个 screen 窗口后,命令行本身并没有区别。 如果打开多个窗口,可以使用快捷键C-a w列出当前所有窗口。

并在在终端的的连接标题标签上也会显示 screen 的信息,从而方便辨识。

4.4 会话分离与恢复

可以不中断screen窗口中程序的运行而暂时断开(detach)screen会话,并在随后时间重新连接(attach)该会话,重新控制各窗口中运行的程序。

[dave@www.cndba.cn ~]# screen -S dave

[dave@www.cndba.cn ~]# screen -ls
There are screens on:
        15276.dave      (Attached)
        14880.pts-1.observer1   (Attached)
2 Sockets in /var/run/screen/S-root.

然后执行我们需要的命令,比如:

[dave@www.cndba.cn ~]#vi /tmp/cndba.cn

此时窗口是编辑状态,直接在screen窗口键入C-a d,Screen会给出detached提示:http://www.cndba.cn/dave/article/131436

[dave@www.cndba.cn ~]# screen -S dave
[detached from 15276.dave]
[dave@www.cndba.cn ~]# 

[dave@www.cndba.cn ~]# screen -ls
There are screens on:
        15276.dave      (Detached)
        14880.pts-1.observer1   (Attached)
2 Sockets in /var/run/screen/S-root.

[dave@www.cndba.cn ~]#

重连会话:

[dave@www.cndba.cn ~]# screen -r 15276

就又回到我们之前的操作窗口了。http://www.cndba.cn/dave/article/131436

这里有一个注意事项,如果另一台机器上没有分离一个Screen会话,就无从恢复会话:

http://www.cndba.cn/dave/article/131436

[dave@www.cndba.cn ~]# screen -ls
There is a screen on:
        15460.pts-1.observer1   (Attached)
1 Socket in /var/run/screen/S-root.

[dave@www.cndba.cn ~]# screen -r 15460
There is a screen on:
        15460.pts-1.observer1   (Attached)
There is no screen to be resumed matching 15460.
[dave@www.cndba.cn ~]#

可以先使用 screen -d命令强制将这个会话从它所在的终端分离,然后在转移到新终端:

[dave@www.cndba.cn ~]# screen -d
[15460.pts-1.observer1 detached.]

[dave@www.cndba.cn ~]# screen -ls
There is a screen on:
        15460.pts-1.observer1   (Detached)
1 Socket in /var/run/screen/S-root.

[dave@www.cndba.cn ~]# screen -r 15460
[dave@www.cndba.cn ~]# screen -ls
There is a screen on:
        15460.pts-1.observer1   (Attached)
1 Socket in /var/run/screen/S-root.

[dave@www.cndba.cn ~]# [dave@www.cndba.cn ~]# screen -d
[15460.pts-1.observer1 detached.]

[dave@www.cndba.cn ~]# screen -ls
There is a screen on:
        15460.pts-1.observer1   (Detached)
1 Socket in /var/run/screen/S-root.

[dave@www.cndba.cn ~]# screen -r 15460
[dave@www.cndba.cn ~]# screen -ls
There is a screen on:
        15460.pts-1.observer1   (Attached)
1 Socket in /var/run/screen/S-root.

[dave@www.cndba.cn ~]#

4.5 关闭终端

当程序运行结束后,不需要这个虚拟终端了,可以进入对应虚拟终端,然后输入exit 释放终端资源。

[dave@www.cndba.cn ~]# exit
exit
[dave@www.cndba.cn ~]# screen -ls
There is a screen on:
        14880.pts-1.observer1   (Attached)
1 Socket in /var/run/screen/S-root.

[dave@www.cndba.cn ~]#

可以使用快捷键:C-a k,先进入 screen 终端,执行C-a k快捷键杀死当前的窗口,同时也将杀死这个窗口中正在运行的进程。在按下 k 会,窗口的最下面一行也会有个提示,让我们确认是否关闭终端。

除了使用 exit 需要先进入到 screen 终端,也可以在主终端,直接

[dave@www.cndba.cn ~]# screen -ls
There is a screen on:
        15460.pts-1.observer1   (Detached)
1 Socket in /var/run/screen/S-root.

# 使用-R/-r/-S均可
[dave@www.cndba.cn ~]# screen -r 15460 -X quit
[dave@www.cndba.cn ~]# screen -ls
No Sockets found in /var/run/screen/S-root.

[dave@www.cndba.cn ~]#

版权声明:本文为博主原创文章,未经博主允许不得转载。

用户评论
* 以下用户言论只代表其个人观点,不代表CNDBA社区的观点或立场
dave

dave

关注

人的一生应该是这样度过的:当他回首往事的时候,他不会因为虚度年华而悔恨,也不会因为碌碌无为而羞耻;这样,在临死的时候,他就能够说:“我的整个生命和全部精力,都已经献给世界上最壮丽的事业....."

  • 2237
    原创
  • 2
    翻译
  • 535
    转载
  • 185
    评论
  • 访问:6531739次
  • 积分:4229
  • 等级:核心会员
  • 排名:第1名
精华文章
    最新问题
    查看更多+
    热门文章
      热门用户
      推荐用户
        Copyright © 2016 All Rights Reserved. Powered by CNDBA · 皖ICP备2022006297号-1·

        QQ交流群

        注册联系QQ