A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
VT100 / ANSI
终端仿真启动一个屏幕管理器。你是不是经常需要 SSH 或者 telent 远程登录到 Linux 服务器?你是不是经常为一些长时间运行的任务而头疼,比如系统备份、ftp 传输等等。通常情况下我们都是为每一个这样的任务开一个远程终端窗口,因为他们执行的时间太长了。必须等待它执行完毕,在此期间可不能关掉窗口或者断开连接,否则这个任务就会被杀掉,一切半途而废了。
-bash: screen: command not found #Debian apt-get install screen #Ubuntu apt-get install screen #Alpine apk add screen #Arch Linux pacman -S screen #Kali Linux apt-get install screen #CentOS yum install screen #Fedora dnf install screen #OS X brew install screen #Raspbian apt-get install screen #Docker docker run cmd.cat/screen screen
使用 screen 命令,您可以在单个终端窗口中创建多个终端会话,在它们之间切换并彼此相邻显示。Screen 是一个可以在多个进程之间多路复用一个物理终端的窗口管理器。Screen 中有会话的概念,用户可以在一个 screen 会话中创建多个 screen 窗口,在每一个 screen 窗口中就像操作一个真实的 telnet / SSH 连接窗口那样。
在 Linux/Unix 中,有这样几个概念:
根据 POSIX.1
定义:
因此当网络断开或终端窗口关闭后,控制进程收到 SIGHUP
信号退出,会导致该会话期内其他进程退出。
screen [ -options ] [ cmd [ args ] ] screen -r [[pid.]tty[.host]] screen -r sessionowner/[[pid.]tty[.host]]
-A 将所有的视窗都调整为目前终端机的大小。 -d <作业名称> 将指定的screen作业离线。 -h <行数> 指定视窗的缓冲区行数。 -m 即使目前已在作业中的screen作业,仍强制建立新的screen作业。 -r <作业名称> 恢复离线的screen作业。 -R 先试图恢复离线的作业。若找不到离线的作业,即建立新的screen作业。 -s 指定建立新视窗时,所要执行的shell。 -S <作业名称> 指定screen作业的名称。 -v 显示版本信息。 -x 恢复之前离线的screen作业。 -ls或--list 显示目前所有的screen作业。 -wipe 检查目前所有的screen作业,并删除已经无法使用的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 选定的内容贴上
你可以在命令行中输入 screen 来启动它,接着会有一个看上去和命令行提示符一样的 screen 会话启动。
# screen 在一些流行的发行版上已经预安装了。你可以使用下面的命令检查是否已经在你的服务器上安装了。 [root@commandnotfound ~]$ screen -v Screen version 4.01.00devel (GNU) 2-May-06 #如何启动一个 screen 会话 [root@commandnotfound ~]$ screen
使用描述性名称启动屏幕会话是一个很好的做法,这样你可以轻松地记住会话中正在运行的进程。要使用会话名称创建新会话,请运行以下命令:
screen -S name #将 “name” 替换为对你会话有意义的名字。
要从当前的 screen 会话中分离,你可以按下 Ctrl-A 和 d。所有的 screen 会话仍将是活跃的,你之后可以随时重新连接,如果你从一个会话分离,或者由于某些原因你的连接被中断了,你可以使用下面的命令重新连接:
$ screen -r #如果你有多个 screen 会话,你可以用 ls 参数列出它们。 $ screen -ls There are screens on: 7880.session (Detached) 7934.session2 (Detached) 7907.session1 (Detached) 3 Sockets in /var/run/screen/S-root. #在我们的例子中,我们有三个活跃的 screen 会话。因此,如果你想要还原 “session2” 会话,你可以执行: screen -r 7934 #或者使用 screen 名称 screen -r -S session2
有几种方法来中止 screen 会话。你可以按下 Ctrl+d,或者在命令行中使用 exit 命令:
会话共享:还有一种比较好玩的会话恢复,可以实现会话共享。假设你在和朋友在不同地点以相同用户登录一台机器,然后你创建一个screen会话,你朋友可以在他的终端上命令:
screen -x
这个命令会将你朋友的终端 Attach 到你的 Screen 会话上,并且你的终端不会被 Detach。这样你就可以和朋友共享同一个会话了,如果你们当前又处于同一个窗口,那就相当于坐在同一个显示器前面,你的操作会同步演示给你朋友,你朋友的操作也会同步演示给你。当然,如果你们切换到这个会话的不同窗口中去,那还是可以分别进行不同的操作的。
screen 开始一个新的屏幕会话:
screen
screen 启动一个新的命名屏幕会话:
screen -S session_name
screen 启动一个新的守护进程,并将输出记录到 screenlog.x
:
screen -dmLS session_name command
screen 显示打开的屏幕会话:
screen -ls
screen 重新连接到打开的屏幕:
screen -r session_name
screen 从屏幕内部分离:Ctrl + A, D
screen 杀死一个独立的屏幕:
screen -X -S session_name quit